¿Es más rápido para declarar variables dentro de un bucle o fuera de un bucle? Por ejemplo:¿Más rápido para declarar variables dentro de un bucle o fuera de un bucle?
' 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
¿Cuál es más rápido? ¿Por qué? Asumo que este último es más rápido, ya que se acaba de volver a utilizar el mismo "puntero" para hacer referencia a un nuevo valor detrás de las escenas en lugar de crear un nuevo puntero de cada iteración, correcto? ¿Puede alguien elaborar?
Gracias
Actualizado:
El compilador es suficientemente inteligente para optimizar el código cuando se genera el lenguaje intermedio. Mueve las declaraciones de variables a la parte superior del método. A continuación, es el declartions dentro de la IL después de la compilación:
.locals init ([0] string newVariable2,
[1] int32 i,
[2] string newVariable,
[3] int32 V_3,
[4] int32 VB$CG$t_i4$S0)
Aquí está toda la IL para los interesados:
.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
Tal vez el compilador optimizarlo? El mejor consejo: inicie su IDE, crea instancias de un cronómetro y ejecute algunos miles de iteraciones de cada versión y vea si hay una diferencia real. –
¡Buena idea! Brb con los resultados ... – Moderator71
¿Está tratando de resolver un problema de rendimiento real o simplemente está aburrido y jugando con micro optimizaciones que nunca representarán una diferencia significativa en una aplicación del mundo real? – JohnFx