Tuve esta misma pregunta durante mucho tiempo. Así que probé un código aún más simple.
Conclusión: Para tales casos, NO hay diferencia de rendimiento.
Caja de bucle exterior
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
Caja de bucle interior
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
Revisé el archivo compilado en el descompilador de IntelliJ y para ambos casos, obtuve el mismo Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
También desarme el código para ambos casos usando el método dado en esta respuesta . Solo mostraré las partes relevantes para la respuesta
Caja de bucle exterior
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;
Caja de bucle interior
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 presta mucha atención, solo los Slot
asignados i
yintermediateResult
en LocalVariableTable
se intercambian como un producto de su orden de aparición. La misma diferencia en la ranura se refleja en otras líneas de código.
- No se realiza ninguna operación adicional.
intermediateResult
sigue siendo una variable local en ambos casos, por lo que no hay diferencia en el tiempo de acceso.
PRIMA
Los compiladores optimizan muchísimo, eche un vistazo a lo que sucede en este caso.
Caso de trabajo cero
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Cero trabajo descompilado
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}