Pourquoi Utiliser Entier au Lieu de Long?
Je vois souvent des questions relatives à Overflow
erreurs avec vba.
Ma question est: pourquoi utiliser le integer
la déclaration de la variable au lieu de simplement définir toutes les variables numériques (à l'exclusion des double
etc.) comme long
?
Sauf si vous effectuez une opération comme dans une boucle où vous pouvez garantir que la valeur à ne pas dépasser la limite de 32 767, est-il un impact sur les performances ou quelque chose d'autre qui ne le voudrait pas, à l'aide de long
?
Vous devez vous connecter pour publier un commentaire.
msdn
msdn
Donc, l'avantage est une réduction de l'espace mémoire. Un Entier prend la moitié de la mémoire d'une longue n'. Maintenant, nous parlons de 2 octets, donc il ne va pas faire une réelle différence, sauf si vous êtes le stockage d'une TONNE de nombres entiers.
MAIS sur un 32 bits, 16 bits entier pénètre silencieusement converti en long sans le bénéfice de la plus grande plage de numéros de travailler avec. Des débordements se produisent encore et il faut tout simplement que beaucoup de mémoire. Les performances peuvent même être mal parce que le type de données doit être converti (à un niveau très faible).
Pas la référence que je cherchais, mais....
ozgrid forums
C'est la référence que je cherchais.
pcreview forum
Et enfin j'ai trouvé le la documentation msdn j'ai été vraiment vraiment à la recherche pour.
Donc, en résumé, il n'y a presque pas de bonne raison d'utiliser un
Integer
type de ces jours. Sauf vous avez besoin pour l'Interopérabilité avec une vieille appel d'API qui attend un 16 bits int.Grâce à Vba4All pour souligné.
Integer
est lors de la déclaration d'unType
, où le type de mise en page et la taille est importante, soit parce que vous êtes de passage le type à une API, ou vous êtes de la sérialisation/désérialisation d'un fichier, ou vous êtes à la copie des octets avecLSet
/Rset
.Integer
s en interne traitées commeLong
s à l'intérieur d'un processeur, mais pour tous les observables fins, uneInteger
prend toujours deux octets. Voir les réponses et les commentaires en-dessous de stackoverflow.com/q/26717148/11683 pour prolonger la discussion.the msdn documentation I was really truly looking for.
Cependant mon commentaire a été principalement orientée vers les futurs lecteurs plutôt que de vous-même, parce que vous avez participé dans l'autre question, même si votre réponse à mon avis ne doit pas avoir été accepté (celui-ci je crois auraient dû l'être).Comme indiqué dans d'autres réponses, la différence réelle entre un int et long est la taille de son espace de mémoire et, par conséquent, la taille du nombre qu'il peut contenir.
voici l'intégralité de la documentation sur ces types de données
http://msdn.microsoft.com/en-us/library/office/ms474284(v=office.14).aspx
un Entier est de 16 bits, et peut représenter une valeur entre de -32 768 et 32 767
un Long est 32 bits et peut représenter de 2 147 483 647 -2 147 483 648 à
et il y a un LongLong qui est de 64 bits et peut traiter comme 9 pentilion
L'une des choses les plus importantes à retenir est que les types de données diffèrent par la langue et le système d'exploitation /plateforme. Dans votre monde de VBA un long est de 32 bits, mais en c# sur un processeur 64 bits long est de 64 bits. Cela peut introduire une confusion importante.
Bien que VBA n'ont pas de soutien pour elle, lorsque vous vous déplacez vers une autre langue dans .net ou java, ou autres, je préfère utiliser le système de types de données de int16, int32 et int64 qui me permet de b beaucoup plus de transparence sur les valeurs qui peuvent être détenues dans ces types de données.
VBA a beaucoup de bagage historique.
Un
Integer
est de 16 bits de large et a une bonne valeur par défaut du type numérique en arrière lors de la 16 bits de l'architecture/mot tailles étaient répandus.Un
Long
est 32 bits et (OMI) doit être utilisé dans la mesure du possible.Même si ce post est de quatre ans, j'étais curieux de savoir à ce sujet et a couru quelques tests. La chose la plus importante à noter est que l'un codeur doit TOUJOURS déclarer une variable comme quelque CHOSE de. Les variables non déclarées clairement effectué le pire (non déclarées sont techniquement
Variant
)Long
a effectuer de la manière la plus rapide, donc je pense que Microsoft recommande d'utiliser toujoursLong
au lieu deInteger
de sens. Je suppose que le même comme vrai avecByte
, mais la plupart des codeurs de ne pas l'utiliser.RÉSULTATS SUR UNE VERSION 64 BITS DE WINDOWS 10 POUR ORDINATEUR PORTABLE
Code Utilisé:
Dim a as Variant, b as Variant, c As Variant
doit donner le même effet que de "variation" à tous.C'est un espace vs nécessité problème.
Dans certaines situations, c'est un nécessité d'utiliser un long temps. Si vous êtes à la boucle à travers les rangées dans un grand fichier excel, la variable qui contient le numéro de ligne doit être longue.
Cependant, parfois, vous saurez qu'un entier puisse prendre en charge votre problème et à l'aide d'une longue serait une perte de espace (de mémoire). Les variables individuelles n'a vraiment pas beaucoup de différence, mais quand vous commencez à traiter avec les tableaux, il peut faire une grande différence.
Dans VBA7, des Entiers de 2 octets et longs sont de 4 octets
Si vous avez un tableau de 1 million de numéros entre 1 et 10, à l'aide d'un tableau d'Entiers prendrait sur 2 mo de RAM, comparativement à environ 4 MO de RAM pour un tableau.
J'ai pris @PGSystemTester de la méthode et mis à jour afin de supprimer une partie du potentiel de variabilité. En plaçant la boucle dans les routines, ce qui supprime le temps d'appeler la routine (qui est un beaucoup de temps). J'ai également désactivé l'écran de mise à jour pour supprimer toutes les retards que cela pourrait causer.
Long
encore effectué le meilleur, et que ces résultats sont plus étroitement limitée aux impacts des types de variables seul, l'amplitude de variation est intéressant de noter.Mes résultats (poste de travail, Windows 7, Excel 2010):
Code utilisé:
Comme déjà mentionné, un Long peut prendre deux fois plus de place qu'un Entier. Comme d'autres l'ont aussi déjà mentionné, la grande capacité des ordinateurs actuels signifie que vous pourrez voir aucune différence dans les performances que ce soit, à moins d'avoir affaire à des extra grandes quantités de données:
Mémoire
Considérant 1 million de valeurs, la différence entre l'utilisation de nombres Entiers contre la Nostalgie serait de 2 octets pour chaque valeur, de sorte que c'est 2 * 1 000 000 /1,024 /1024 = moins de 2 MO de différence dans votre mémoire RAM, qui est probablement beaucoup moins de 1% ou 0,1% de votre capacité de mémoire vive.
Traitement
Compte tenu de la référence faite par PGSystemTester, vous pouvez voir une différence de 811 - 745 = 66 secondes entre Longs et les nombres Entiers, lors du traitement de 10 milliards de lots de 4 opérations de chacun. Réduire le nombre de 1 millions d'opérations et on peut s'attendre à 66 /10 000 /4 = moins de 2 ms de différence de temps d'exécution.
Personnellement, j'utilise des Entiers et Aspire à aider à la lisibilité de mon code, en particulier dans les boucles, où un nombre Entier indique que la boucle devrait être de petite taille (moins de 1000 itérations), alors qu'une Longue raconte-moi la boucle devrait être relativement important (plus de 1000).
Note ce subjective seuil en deçà de l'Entier de la limite supérieure, j'utilise Désire juste pour faire la distinction entre mes propres définitions des petits et des grands.