web-dev-qa-db-fra.com

Pourquoi devrais-je utiliser int au lieu d'un octet ou d'un court-circuit en C #

J'ai trouvé quelques discussions en ce qui concerne cette question. La plupart des gens semblent favoriser l'utilisation d'int dans leur code C # accrocher le tableau même si un octet ou un smallint gérerait les données à moins que ce ne soit une application mobile. Je ne comprends pas pourquoi. N'a-t-il plus de sens de définir votre type de données C # comme le même type de données dans votre solution de stockage de données?

Ma prémisse: Si j'utilise un jeu de données Tapé, des classes Linq2SQL, POCO, une manière ou une autre, je vais rencontrer des problèmes de conversion de type DataType compilateur si je ne conserve pas mes fichiers de données en Sync sur mes niveaux. Je n'aime pas vraiment faire le système.Convertir tout le temps simplement parce qu'il était plus facile d'utiliser INT Accross le tableau en C # Code. J'ai toujours utilisé tout ce que le plus petit type de données est nécessaire pour gérer les données de la base de données ainsi que dans le code, pour conserver mon interface avec la base de données propre. Je parierais donc que 75% de mon code C # utilise l'octet ou court par rapport à l'INT, car c'est ce qui est dans la base de données.

Possibilités: Cela signifie-t-il que la plupart des personnes qui utilisent simplement INT pour que tout dans le code utilise également le type de données INT pour leurs fichiers de données SQL STOCTAGE et pourrait en se soucier de la taille globale de leur base de données ou de faire des systèmes de conversation dans le code, le cas échéant?

Pourquoi je me soucie: J'ai travaillé seul pour toujours et je veux juste connaître les meilleures pratiques et les conventions de codage standard.

59
Breadtruck

La performance-sage, un Int est plus rapide dans presque tous les cas. La CPU est conçue pour fonctionner efficacement avec des valeurs 32 bits.

Les valeurs plus courtes sont compliquées de traiter. Pour lire un octet unique, disons que la CPU doit lire le bloc 32 bits qui la contient, puis masquer les 24 bits supérieurs.

Pour écrire un octet, il doit lire le bloc de destination 32 bits, écraser les 8 bits inférieurs à la valeur d'octets souhaitée et écrivez à nouveau le bloc de 32 bits entier.

Space-sage, bien sûr, vous économisez quelques octets en utilisant des fichiers de données plus petits. Donc, si vous construisez une table avec quelques millions de lignes, des types de fichiers plus courts peuvent valoir la peine d'être envisagé. (Et la même chose pourrait être bonne raison pour laquelle vous devriez utiliser des fichiers de données plus petits dans votre base de données)

Et correction-sage, un INT ne déborde pas facilement. Et si vous -pensez Votre valeur va s'adapter à un octet, puis à un moment donné à un moment donné, une modification d'aspect inoffensive du code signifie que les valeurs plus volumineuses sont stockées?

Ce sont quelques-unes des raisons pour lesquelles INT devrait être votre type de données par défaut pour toutes les données intégrées. Utilisez uniquement l'octet si vous souhaitez réellement stocker des octets de la machine. Utilisez uniquement des shorts si vous traitez avec un format de fichier ou un protocole ou similaire spécifiant en réalité des valeurs entières 16 bits. Si vous avez simplement affaire avec des entiers en général, faites-les.

81
jalf

Vous devriez faire face à quelques milliards de lignes avant que cela ne produise de différence significative en termes de capacité de stockage. Disons que vous avez trois colonnes et au lieu d'utiliser un type de base de données équivalent d'octets, vous utilisez un équivalent INT.

Cela nous donne 3 (colonnes) x 3 (octets supplémentaires) par ligne ou 9 octets par rangée.

Cela signifie que "quelques millions de lignes" (disons trois millions), vous consommez un total de 27 mégaoctets d'espace disque! Heureusement, comme nous ne vivons plus dans les années 1970, vous ne devriez pas avoir à vous soucier de cela :)

Comme indiqué ci-dessus, arrêtez la micro-optimisation - les performances de la conversion de différents types numériques entier entier vont vous frapper beaucoup, beaucoup plus difficile que les coûts de bande passante/diskspace, à moins que vous ne traitez très, très très grand jeux de données.

8
Jon Grant

Pour la plupart, "non".

À moins que vous sachiez d'avance sur le fait que vous allez traiter avec 100 millions de lignes, c'est une micro-optimisation.

Faites ce qui correspond au modèle de domaine le mieux. Plus tard, si vous avez des problèmes de performance, de l'indice de référence et du profil dans le point d'épingle où ils se produisent.

7
Mitch Wheat

Pas que je ne croyais pas Jon Grant et d'autres, mais je devais me voir avec notre "million de rangs". La table compte 1 018 000. J'ai converti 11 colonnes tinytins et 6 petites colonnes dans Int, il y avait déjà 5 Int & 3 SmallDaTones. 4 index différents ont utilisé un combo des différents types de données, mais évidemment, les nouveaux index utilisent désormais tous les colonnes d'int.

Faire des changements ne coûte que 40 Mo d'utilisation du disque de table de base de base sans index. Lorsque j'ai ajouté que les index dans la modification globale ne concernaient que 30 Mo de différence globale. J'ai donc été surpris parce que je pensais que la taille de l'index serait plus grande.

Donc, 30 MB valent le problème d'utiliser tous les types de données différents, sans aucun cas! Je pars à la terre d'INT, merci à tout le monde pour avoir défini ce programmateur analogique anal faisant la vie heureuse et heureuse de la vie entière de non plus de conversions entier ... Yippeee!

5
Breadtruck

Si INT est utilisé partout, aucun casting ni conversion n'est requis. C'est une plus grande frappe pour le mât que la mémoire que vous économiserez en utilisant plusieurs tailles entier.

Cela rend simplement la vie plus simple.

4
Robert Harvey

Le temps d'exécution .NET est optimisé pour INT32. Voir la discussion précédente à - . NET INTEGER VS INT16?

4
Dan Diplo