Czy szybciej jest zadeklarować zmienne w pętli lub poza pętlą? Na przykład:Szybciej deklarować zmienne w pętli lub poza pętlą?
' 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
Który z nich jest szybszy? Czemu? Zakładam, że ta ostatnia jest szybsza, ponieważ jest to ponowne użycie tego samego "wskaźnika", aby odwoływać się do nowej wartości za kulisami zamiast tworzenia nowego wskaźnika w każdej iteracji, prawda? Czy ktoś może rozwinąć?
Dzięki
aktualizacja:
kompilator wystarczająco inteligentny, aby zoptymalizować kod podczas generowania Intermediate Language. Przenosi deklaracje zmiennych na górę metody. Poniżej jest declartions obrębie IL po kompilacji:
.locals init ([0] string newVariable2,
[1] int32 i,
[2] string newVariable,
[3] int32 V_3,
[4] int32 VB$CG$t_i4$S0)
Oto cała IL dla zainteresowanych:
.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
Może kompilator zoptymalizuje go? Najlepsza rada: odpal IDE, stwórz stoper i uruchom kilka tysięcy powtórzeń każdej wersji i zobacz, czy jest jakaś prawdziwa różnica. –
Dobry pomysł! Brb z wynikami .. – Moderator71
Czy próbujesz rozwiązać rzeczywisty problem z wydajnością, czy po prostu jesteś znudzony i bawiąc się mikro-optymalizacjami, które nigdy nie będą stanowiły znaczącej różnicy w prawdziwym świecie aplikacji? – JohnFx