Eu tive essa mesma pergunta por um longo tempo. Então eu testei um pedaço de código ainda mais simples.
Conclusão: Para esses casos , NÃO há diferença de desempenho.
Caso de loop externo
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
Caso interno do laço
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
Eu verifiquei o arquivo compilado no descompilador do IntelliJ e, nos dois casos, obtive o mesmo Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
Também desmontei o código para ambos os casos, usando o método fornecido nesta resposta . Vou mostrar apenas as partes relevantes para a resposta
Caso de loop externo
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;
Caso interno do laço
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;
Se você prestar atenção, apenas o Slot
designado para i
e intermediateResult
em LocalVariableTable
é trocado como um produto da sua ordem de aparecimento. A mesma diferença no slot é refletida em outras linhas de código.
- Nenhuma operação extra está sendo executada
intermediateResult
ainda é uma variável local nos dois casos, portanto não há diferença no tempo de acesso.
BÔNUS
Os compiladores fazem uma tonelada de otimização, dê uma olhada no que acontece neste caso.
Zero caso de trabalho
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Zero trabalho descompilado
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}