2010-10-29 2 views
1

Bonne nuit,SQLite & Int64 à Int32 coulé en C#

J'ai une requête SQLite que j'exécutaient en C# en utilisant la commande ExecuteScalar(). Le résultat dans une variable de type Object qui est en fait une valeur de type Int64. Comme j'ai besoin de le lancer sur un Int32, j'ai essayé d'abord en utilisant Convert.ToInt32 et maintenant j'utilise (Int32)(Int64)Object, bien que j'obtienne la même performance avec les deux. La question est que ce type de distribution semble prendre 6ms supplémentaires à effectuer, et la méthode concernée est un code critique qui devrait être exécuté aussi vite que possible ... Y at-il un moyen d'effectuer cette distribution plus rapidement, en utilisant, par exemple , opérateurs de bits ou une autre méthode?

Juste au cas où ce n'est pas possible, je ne comprends vraiment pas pourquoi le résultat de la requête est un Int64 ... est-il possible de le forcer à être un Int32?

Merci beaucoup.

Répondre

1

Vous pouvez utiliser un lecteur de données au lieu d'exécuter scalar et appeler la fonction statique getint32. Je ne sais pas si ce serait plus rapide cependant.

Vous pouvez également convertir votre résultat dans la requête SQL avant de le renvoyer. Encore une fois, cela peut effectivement diminuer la performance globale.

+0

Merci beaucoup. La première suggestion fonctionne et est plus rapide d'un facteur de 2-3x. – Miguel

+0

Je l'ai seulement mentionné parce que j'ai des raisons de suspecter que ExecuteScalar crée juste un lecteur de données et renvoie le premier objet dans la première rangée/colonne. Cela signifierait qu'il fait aussi une opération de boxe supplémentaire. La différence devrait être assez triviale, mais je suppose que ce n'est pas dans ce cas. 6ms semble être un très long moment pour effectuer un double casting (avec conversion implicite) sur un boxed puis unboxed int64. Étiez-vous en train de tester la vitesse à l'intérieur d'un harnais de test? – wllmsaccnt