7

Lets compare two pieces of code:

String str = null;
//Possibly do something...
str = "Test";
Console.WriteLine(str);

and

String str;
//Possibly do something...
str = "Test";
Console.WriteLine(str);

I was always thinking that these pieces of code are equal. But after I have build these code (Release mode with optimization checked) and compared IL methods generated I have noticed that there are two more IL instructions in the first sample:

1st sample code 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(string)
IL_000e: ret

2nd sample code 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

Possibly this code is optimized by JIT compiller? So does the initialization of local bethod variable with null impacts the performence (I understand that it is very simple operation but any case) and we should avoid it? Thanks beforehand.

4

3 回答 3

8

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

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

于 2011-01-20T20:55:25.810 回答
6

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

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

我知道这可能是一个学术问题,我并不贬低理解 CLR 内部结构的价值。但在这种情况下,它似乎只是关注错误的事情。

于 2011-01-20T21:21:42.543 回答
2

今天(2019 年),.NET Framework 和 .NET Core编译器都足够智能,可以优化不需要的初始化。(连同无用的stloc.0-ldloc.0对。)

两个版本都编译为

        .maxstack 8

        ldstr "Test"
        call void [System.Console]System.Console::WriteLine(string)
        ret

请参阅我的SharpLab 实验作为参考。

但当然实现会发生变化,但贾斯汀的回答是永恒的:我出于好奇做了这个实验,在真实情况下专注于代码的清晰度和表现力,而忽略了微优化。

于 2019-07-12T15:17:30.687 回答