Is it faster to declare variables inside a loop or outside a loop? For example:
' 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
Which one is faster? What for? I guess the latter is faster because it just reuses the same βpointerβ to refer to the new value behind the scenes instead of creating a new pointer at each iteration, right? Can someone clarify?
thanks
Updated:
The compiler is smart enough to optimize the code when creating an intermediate language. It moves variable declarations to the top of the method. Following are the declarations inside IL after compilation:
.locals init ([0] string newVariable2, [1] int32 i, [2] string newVariable, [3] int32 V_3, [4] int32 VB$CG$t_i4$S0)
Here is the whole IL for those interested:
.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
Moderator71
source share