Ich hatte lange die gleiche Frage. Also habe ich einen noch einfacheren Code getestet.
Schlussfolgerung: In solchen Fällen gibt es KEINEN Leistungsunterschied.
Außenschleifenkasten
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
Innenschleifenkoffer
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
Ich habe die kompilierte Datei auf dem IntelliJ-Dekompiler überprüft und in beiden Fällen das gleiche erhalten Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
Ich habe auch Code für beide Fälle mit der in dieser Antwort angegebenen Methode zerlegt . Ich werde nur die Teile zeigen, die für die Antwort relevant sind
Außenschleifenkasten
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_2
2: iload_2
3: sipush 1000
6: if_icmpge 26
9: iload_2
10: iconst_2
11: iadd
12: istore_1
13: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iload_1
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: iinc 2, 1
23: goto 2
26: return
LocalVariableTable:
Start Length Slot Name Signature
13 13 1 intermediateResult I
2 24 2 i I
0 27 0 args [Ljava/lang/String;
Innenschleifenkoffer
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 26
9: iload_1
10: iconst_2
11: iadd
12: istore_2
13: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iload_2
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: iinc 1, 1
23: goto 2
26: return
LocalVariableTable:
Start Length Slot Name Signature
13 7 2 intermediateResult I
2 24 1 i I
0 27 0 args [Ljava/lang/String;
Wenn Sie genau hinschauen, wird nur das Slot
zugewiesene i
und intermediateResult
in LocalVariableTable
als Produkt ihrer Erscheinungsreihenfolge ausgetauscht. Der gleiche Unterschied im Steckplatz spiegelt sich in anderen Codezeilen wider.
- Es wird keine zusätzliche Operation ausgeführt
intermediateResult
ist in beiden Fällen immer noch eine lokale Variable, daher gibt es keinen Unterschied bei der Zugriffszeit.
BONUS
Compiler optimieren eine Menge, schauen Sie sich an, was in diesem Fall passiert.
Null Arbeitsfall
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Null Arbeit dekompiliert
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}