变量名长度对性能C#有影响吗?

变量名长度对性能C#有影响吗?,c#,performance,C#,Performance,我一直在想,在WinForms C#中使用长描述性变量名是否会影响性能?我之所以问这个问题,是因为在AutoIt v3(解释语言)中,有人提出将aa等短名称变量替换为veryLongVariableName要快得多(当程序大于5行时)。我想知道它在C#?中是否相同不,它不一样。编译器实际上不保存原始变量名,您可以使用反汇编程序查看任何已编译程序集的IL代码。不,我认为长变量对.NET应用程序的执行性能没有任何影响。另外,.NET程序集中的中间代码(MSIL)在执行之前被翻译成机器语言。在这里,变

我一直在想,在WinForms C#中使用长描述性变量名是否会影响性能?我之所以问这个问题,是因为在AutoIt v3(解释语言)中,有人提出将
aa
等短名称变量替换为
veryLongVariableName
要快得多(当程序大于5行时)。我想知道它在C#?

中是否相同不,它不一样。编译器实际上不保存原始变量名,您可以使用反汇编程序查看任何已编译程序集的IL代码。

不,我认为长变量对.NET应用程序的执行性能没有任何影响。另外,.NET程序集中的中间代码(MSIL)在执行之前被翻译成机器语言。在这里,变量名肯定会被“抛出”(如果之前没有发生过的话),并被简单的内存地址所取代。

这无关紧要。尽管在反编译时可以获得名称(有关详细信息,请参阅其他帖子),但IL指令从变量/字段读取或写入变量/字段时不会使用这些名称。变量和字段通过不同的构造进行标识。在reflection.emit名称空间中,它们由LocalBuilder表示(对于局部变量或字段),并进一步强调这一点:它们甚至不需要显式命名

这是编译器和解释器之间的关键区别。解释器在解释代码时执行标识符名称查找。如果该名称查找发生在执行多次的循环中,则该查找所需的时间可能很重要。名字越长,时间就越长

C#编译器在两个不同的阶段消除标识符名称。当它将源代码编译为IL时,本地变量的名称将被擦除并替换为堆栈帧偏移量。命名空间和类型名称仍存在于程序集中。JIT编译器会删除这些值,并将它们替换为方法的代码偏移量和字段的数据偏移量。标识符名称的长度在这里并不重要,查找只发生一次


顺便说一句,消除在解释器中查找名称的开销并不困难。一个好的解释器将源代码标记化,本质上是一个预编译步骤,以提高解释器的效率。这样的解释器对于长标识符名称也不会有减速问题。

不,一旦编译,原始变量名称将不再使用。变量名的大小对编译时间的影响很小,但对执行时间的影响不大

解释语言会稍微受到长变量名的影响。长名称在每次运行时更易于读取、存储和查找,但影响应该非常小。读取/写入磁盘甚至屏幕的延迟应远远超过较长变量名引起的延迟

如果执行时间是个问题,那么执行效率更高的算法几乎肯定会比缩短变量名提供更高的回报。如果内存压力是个问题,那么高效内存算法可能会比缩短变量名节省更多的内存。如果解决方案在算法上尽可能紧凑,那么是时候使用一种新的语言了


编程中几乎没有绝对值,但我确信,出于性能原因缩短源代码中的变量名每次都是绝对错误的决定。

我认为关于名称长度的问题只适用于项目(在将C#翻译为JavaScript的情况下).

这很奇怪,因为当我用reflector查看我的source.exe时,它显示了我使用过的变量名。编译器还创建了实际存储变量名和代码的.pdb文件。但这些文件仅用于调试,而不是运行.NET应用程序。也许Reflector也可以读取此文件。Reflector从.pdb获取符号名(如果存在),并且在Reflector设置中启用了此行为。@MadBoy:我认为它从pdb获取该信息。局部变量名被删除。成员变量名将被保留。这类应用程序的启动时间如何?它会更短吗?变量名不能到达MSIL。我的问题是理论性的。我不会做太多的表演,哪怕是在这里或那里的一秒钟也不会感到无聊。昏暗,除非你经常有七种不同的音乐,它们都是他们自己认为的另一种音乐;)