J'avais cette même question depuis longtemps. J'ai donc testé un morceau de code encore plus simple.
Conclusion: pour de tels cas, il n'y a PAS différence de performance.
Cas de boucle extérieure
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
Étui à boucle intérieure
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
J'ai vérifié le fichier compilé sur le décompilateur d'IntelliJ et pour les deux cas, j'ai obtenu le même Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
J'ai également démonté le code pour les deux cas en utilisant la méthode indiquée dans cette réponse . Je ne montrerai que les parties pertinentes pour la réponse
Cas de boucle extérieure
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;
Étui à boucle intérieure
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;
Si vous y prêtez attention, seuls les éléments Slot
affectés à i
et intermediateResult
dans LocalVariableTable
sont échangés en tant que produit de leur ordre d'apparition. La même différence de slot se reflète dans les autres lignes de code.
- Aucune opération supplémentaire n'est en cours
intermediateResult
est toujours une variable locale dans les deux cas, il n'y a donc pas de différence de temps d'accès.
PRIME
Les compilateurs font une tonne d'optimisation, regardez ce qui se passe dans ce cas.
Cas de travail zéro
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Zéro travail décompilé
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}