我已经看到了很多关于是否内部或外部for
环路范围内声明变量的问题。这将详细讨论,例如here,here和here。答案是绝对没有性能差异(相同的IL),但为了清楚起见,声明变量在最紧密的范围内是首选。重用的for循环迭代变量
我很好奇,一个稍微不同的情况:
int i;
for (i = 0; i < 10; i++) {
Console.WriteLine(i);
}
for (i = 0; i < 10; i++) {
Console.WriteLine(i);
}
与
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
我预计这两种方法来编译相同的IL在Release模式。然而,这种情况并非如此。我会为您提供完整的IL,并指出其差异。第一种方法有一个地方:
.locals init (
[0] int32 i
)
而第二个只有两个当地人,每个for
循环计数器:
.locals init (
[0] int32 i,
[1] int32 i
)
所以在这两个之间的差异未优化掉,这对我来说很惊奇。
为什么我看到这一点,是有实际的两种方法之间的性能差异?
为什么在意,既然你同意表现也没有什么区别。如何挖掘编译器实现? –
我没有看到任何区别,因为两者都在堆栈 – Slai
@LeiYang链接的问题说没有什么区别,我试图调和我在这个例子中看到的。 – msitt