我一直想知道在WinForms C#中使用长描述性变量名是否对性能有影响?我问这个问题,因为在AutoIt v3(解释语言)中,提出的是使用短名称变量(如aa
而不是veryLongVariableName
)要快得多(当程序大于5班轮时) 。我想知道它在C#中是否相同?
答案 0 :(得分:22)
不,不。编译器实际上不保存原始变量名,您可以使用反汇编程序查看任何已编译程序集的IL代码。
答案 1 :(得分:17)
这是编译器和解释器之间的关键区别。解释器在解释代码时执行标识符名称查找。如果该名称查找发生在执行多次的循环内,则该查找所需的时间可能很重要。更长的名字需要更多的时间。
C#编译器在两个不同的阶段消除了标识符名称。在将源代码编译为IL时,局部变量的名称将被擦除并替换为堆栈帧偏移。命名空间和类型名称仍存在于程序集中。 JIT编译器会删除它们,将其替换为字段的方法和数据偏移的代码偏移。标识符名称的长度在这里无关紧要,查询只发生一次。
在解释器中消除名称查找的费用并不难。一个像样的解释器标记源代码,本质上是一个预编译步骤,以使解释器更有效。这样的解释器也不会出现长标识符名称的减速问题。
答案 2 :(得分:2)
不,一旦编译,就不再使用原始变量名。变量名的大小对编译时间的影响非常小,但对执行时间的影响不大。
解释语言会受到长变量名称的影响。长名称在每次运行时都会更多地进行读取,存储和查找,但影响应该非常小。读/写磁盘甚至屏幕的延迟时间应远远超过变量名称较长引起的延迟。
如果执行时间是问题,那么更多执行高效的算法几乎肯定会提供比缩短变量名称更多的回报。如果内存压力是问题,那么内存有效的算法将再次可能比缩短变量名称节省更多。如果解决方案在算法上尽可能紧,那么现在是新语言的时候了。
编程中几乎没有绝对的东西,但我有信心说源代码中缩短变量名称是出于性能原因绝对是错误的决定。
答案 3 :(得分:1)
不,我不认为long变量会对.NET应用程序的执行性能产生任何影响。 AFAIK,.NET程序集中的中间代码(在MSIL中)在执行之前被转换为机器语言。这将是变量名称肯定被“抛出”的地方(如果它之前还没有发生过)并被简单的内存地址取代。
答案 4 :(得分:1)
没关系。尽管您可以在反编译时获取名称(有关详细信息,请参阅其他帖子)IL指令不使用这些名称读取或写入变量/字段。变量和字段通过不同的构造来识别。在reflection.emit命名空间中,这些由LocalBuilder表示(对于局部变量或FieldBuild表示字段)并进一步强调要点:它们甚至不需要显式命名。
答案 5 :(得分:0)
我认为关于名称长度的问题仅适用于Script#项目(如果将C#转换为JavaScript)。