使用null初始化局部变量会影响性能吗?

pet*_*kyy 7 c# performance il jit initialization

让我们比较两段代码:

String str = null;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
Run Code Online (Sandbox Code Playgroud)

String str;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
Run Code Online (Sandbox Code Playgroud)

我一直认为这些代码是相同的.但是在我构建这些代码(检查了优化的发布模式)并比较生成的IL方法后,我注意到第一个样本中还有两个IL指令:

第一个示例代码IL:

.maxstack 1
.locals init([0] string str)
IL_0000:ldnull
IL_0001:stloc.0
IL_0002:ldstr"Test"
IL_0007:stloc.0
IL_0008:ldloc.0
IL_0009:call void [mscorlib] System.Console :: WriteLine (字符串)
IL_000e:ret

第二个示例代码IL:

.maxstack 1
.locals init([0] string str)
IL_0000:ldstr"Test"
IL_0005:stloc.0
IL_0006:ldloc.0
IL_0007:call void [mscorlib] System.Console :: WriteLine(string)
IL_000c:ret

可能这个代码是由JIT compiller优化的?那么带有null的本地bethod变量的初始化会影响性能(我知道这是非常简单的操作,但无论如何)我们应该避免它吗?先谢谢.

Jon*_*nSG 7

http://www.codinghorror.com/blog/2005/07/for-best-results-dont-initialize-variables.html

总结一下这篇文章,在运行各种基准测试之后,将对象初始化为一个值(作为定义的一部分,在类的构造函数中,或作为初始化方法的一部分)可以在大约10-35%的速度上放慢.NET 1.1和2.0.较新的编译器可以优化定义的初始化.本文最后建议避免初始化作为一般规则.


Jus*_*gan 6

正如Jon.Stromer.Galley的链接指出的那样,它稍微慢一点.但差异非常小; 可能是纳秒级.在那个级别,使用像C#这样的高级语言的开销使任何性能差异都相形见绌.如果性能是一个很大的问题,你也可以使用C或ASM或其他东西进行编码.

编写清晰代码(对您来说意味着什么)的价值将远远超过成本与收益方面0.00001ms的性能提升.这就是为什么首先存在C#和其他高级语言的原因.

我知道这可能是一个学术问题,我并不打算理解CLR内部的价值.但在这种情况下,重点关注似乎是错误的.