Saya memiliki pertanyaan yang sama untuk waktu yang lama. Jadi saya menguji sepotong kode yang lebih sederhana.
Kesimpulan: Untuk kasus seperti itu TIDAK ada perbedaan kinerja.
Kasing luar
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
Di dalam kasing
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
Saya memeriksa file yang dikompilasi pada dekompiler IntelliJ dan untuk kedua kasus, saya mendapatkan yang sama Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
Saya juga membongkar kode untuk kedua kasus menggunakan metode yang diberikan dalam jawaban ini . Saya hanya akan menunjukkan bagian yang relevan dengan jawabannya
Kasing luar
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;
Di dalam kasing
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;
Jika Anda memperhatikan, hanya Slot
ditugaskan untuk i
dan intermediateResult
di LocalVariableTable
swap sebagai produk pesanan mereka dari penampilan. Perbedaan slot yang sama tercermin pada baris kode lainnya.
- Tidak ada operasi tambahan yang dilakukan
intermediateResult
masih merupakan variabel lokal dalam kedua kasus, sehingga tidak ada perbedaan waktu akses.
BONUS
Compiler melakukan banyak optimasi, lihat apa yang terjadi dalam kasus ini.
Kasus nol kerja
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Nol pekerjaan didekompilasi
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}