2010-03-14 6 views
16

Je me demandais si l'utilisation de longs noms de variables descriptifs dans WinForms C# était importante pour les performances? Je pose cette question puisque dans AutoIt v3 (langage interprété) il a été soulevé qu'avoir des variables avec des noms courts comme aa au lieu de veryLongVariableName est beaucoup plus rapide (quand le programme est plus grand que 5 liner). Je me demande si c'est la même chose en C#?La longueur du nom de la variable est-elle importante pour la performance C#?

Répondre

21

Non, ce n'est pas le cas. Le compilateur n'enregistre pas les noms de variables d'origine, vous pouvez regarder le code IL de n'importe quel assemblage compilé avec le désassembleur.

+4

C'est bizarre parce que quand je regarde ma source. Exe avec le réflecteur, il montre les noms de variables que j'ai utilisés. – MadBoy

+0

Vrai, mais le code de langage intermédiaire d'un assembly .NET n'est-il pas traduit en langage machine avant son exécution? (Voir aussi ma réponse.) Si c'est le cas, cela n'a pas d'importance si les noms des variables sont encore dans l'assemblage, car ce que vous voyez là n'est pas ce qui sera exécuté. – stakx

+2

Le compilateur crée également des fichiers .pdb qui stockent réellement les noms de variables et le code. Mais ces fichiers sont utilisés uniquement pour le débogage et non pour l'exécution des applications .NET. Peut-être que Reflector peut lire ces fichiers aussi. –

1

Non, je ne pense pas que cette variable longue ait un impact sur les performances d'exécution d'une application .NET. AFAIK, code intermédiaire (dans MSIL) dans un assembly .NET est traduit en langage machine avant qu'il ne soit exécuté. Ce serait là où les noms de variables sont définitivement "jetés" (si cela ne s'est pas déjà produit plus tôt) et remplacés par de simples adresses mémoire.

+0

Qu'en est-il de l'heure de début d'une telle application? Serait-il plus court? – MadBoy

+0

Les noms de variables ne parviennent pas à MSIL. –

+0

Si c'est ce qui vous préoccupe, je dirais que vous essayez d'optimiser au mauvais endroit. Après tout, un assemblage ne sera chargé qu'une seule fois (dans des situations normales au moins). Même si cela prend 5 millisecondes de plus, cela n'affectera pas vraiment les performances globales de votre application. À mon humble avis, il serait plus rentable de s'inquiéter de la performance des boucles internes (qui seront exécutées de nombreuses fois), l'accès aux données inefficace (HDD/DB accès est beaucoup plus lent que l'accès à la mémoire RAM), etc – stakx

1

Peu importe. Bien que vous puissiez obtenir les noms lors de la décompilation (voir les autres publications pour plus de détails), ces noms ne sont pas utilisés par l'instruction IL Lecture ou écriture dans des variables/champs. Les variables et les champs sont identifiés à travers une construction différente. Dans l'espace de noms reflection.emit, ceux-ci sont représentés par LocalBuilder (pour une variable locale ou FieldBuild pour les champs) et pour souligner davantage le point: ils n'ont même pas besoin d'être explicitement nommés.

15

Il s'agit d'une différence clé entre un compilateur et un interpréteur. Un interpréteur effectue une recherche de nom d'identifiant pendant qu'il interprète du code. Si cette recherche de nom se produit à l'intérieur d'une boucle qui s'exécute plusieurs fois, le temps nécessaire à cette recherche peut avoir de l'importance. Les noms plus longs nécessitent plus de temps.

Le compilateur C# élimine les noms d'identifiants en deux étapes distinctes. Les noms des variables locales sont effacés et remplacés par les décalages de la pile lors de la compilation du code source en IL. Les noms d'espaces de noms et de types sont toujours présents dans l'assembly. Le compilateur JIT les efface, en les remplaçant par des décalages de code pour les méthodes et les décalages de données pour les champs. La longueur des noms d'identifiants n'a pas d'importance ici, la recherche ne se fait qu'une seule fois.

L'élimination du coût de la recherche de nom dans un interpréteur n'est pas difficile. Un interpréteur décent symbolise le code source, essentiellement une étape de pré-compilation pour rendre l'interpréteur plus efficace. Un tel interpréteur n'aurait pas non plus de problème de ralentissement avec les noms d'identifiants longs.

+0

Aurait dû être la réponse acceptée. – ConfusedDeer

2

Non, une fois compilés, les noms de variables d'origine ne sont plus utilisés. La taille des noms de variables devrait avoir un très faible impact sur le temps de compilation, mais pas sur le temps d'exécution.

Les langages interprétés sont affectés un peu par de longs noms de variables. Les noms longs sont plus à lire, stocker et rechercher chaque fois qu'ils s'exécutent, mais l'effet devrait être très faible. La latence de lecture/écriture sur un disque ou même sur l'écran devrait dépasser de loin le retard causé par des noms de variables plus longs.

Si le temps d'exécution est le problème, alors plus d'algorithmes efficaces d'exécution fourniront presque certainement des retours beaucoup plus grands que raccourcir des noms variables. Si la pression de la mémoire est le problème, les algorithmes de mémoire efficace vont encore une fois économiser beaucoup plus que raccourcir les noms de variables. Si la solution est algorithmiquement aussi serrée que possible, il est temps pour une nouvelle langue.

Il y a peu d'absolus dans la programmation, mais je suis confiant dans le fait de dire raccourcir les noms de variables dans le code source pour des raisons de performance est ABSOLUMENT la mauvaise décision à chaque fois.

+0

Dim UnlessYouOftenUseVariableNamesThatAreSoLongThatTheyMayBeConsidéréANovellaAllOnTheirOwn;) – ScottS

0

Je pense que la question sur la longueur du nom est réelle seulement pour Script# projets (dans le cas de la traduction de C# en JavaScript).

Questions connexes