在循环内或循环外声明变量是否更快?例如:更快地声明循环内部或循环外部的变量?
' Declaration inside of the loop
For each item in items
Dim newVariable as String = GetAString()
Next
' Declaration outside of the loop
Dim newVariable as String = String.Empty
For each item in items
newVariable = GetAString()
Next
哪一个更快?为什么?我认为后者更快,因为它只是重复使用相同的“指针”在幕后引用新值,而不是每次迭代都创建新指针,是正确的?有人可以详细说明吗?
由于
更新:产生中间语言时
编译器是足够的智能来优化代码。它将变量声明移动到方法的顶部。下面是IL内declartions编译后:
.locals init ([0] string newVariable2,
[1] int32 i,
[2] string newVariable,
[3] int32 V_3,
[4] int32 VB$CG$t_i4$S0)
这里就是整个IL对于那些有兴趣:
.method private instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 55 (0x37)
.maxstack 2
.locals init ([0] string newVariable2,
[1] int32 i,
[2] string newVariable,
[3] int32 V_3,
[4] int32 VB$CG$t_i4$S0)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.1
IL_0003: ldarg.0
IL_0004: callvirt instance string WindowsApplication1.TestVariableDeclaration::getstring()
IL_0009: stloc.2
IL_000a: nop
IL_000b: ldloc.1
IL_000c: ldc.i4.1
IL_000d: add.ovf
IL_000e: stloc.1
IL_000f: ldloc.1
IL_0010: ldc.i4 0x989680
IL_0015: stloc.s VB$CG$t_i4$S0
IL_0017: ldloc.s VB$CG$t_i4$S0
IL_0019: ble.s IL_0003
IL_001b: ldc.i4.0
IL_001c: stloc.3
IL_001d: ldarg.0
IL_001e: callvirt instance string WindowsApplication1.TestVariableDeclaration::getstring()
IL_0023: stloc.0
IL_0024: nop
IL_0025: ldloc.3
IL_0026: ldc.i4.1
IL_0027: add.ovf
IL_0028: stloc.3
IL_0029: ldloc.3
IL_002a: ldc.i4 0x989680
IL_002f: stloc.s VB$CG$t_i4$S0
IL_0031: ldloc.s VB$CG$t_i4$S0
IL_0033: ble.s IL_001d
IL_0035: nop
IL_0036: ret
} // end of method TestVariableDeclaration::Form1_Load
也许编译器会优化它?最佳建议:启动IDE,实例化秒表,并运行每个版本的几千次迭代,看看是否有真正的差异。 – 2010-10-12 18:20:18
好主意! Brb与结果.. – Moderator71 2010-10-12 18:22:39
你是想解决一个实际的性能问题,或者你只是无聊和玩弄微型优化,永远不会在真实世界的应用程序有意义的区别? – JohnFx 2010-10-12 18:25:52