Uzun zamandır bu aynı soruyu sordum. Bu yüzden daha basit bir kod parçasını test ettim.
Sonuç: For gibi durumlarda vardır YOK performans farkı.
Dış döngü durumda
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
İç döngü durumda
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
Derlenmiş dosyayı IntelliJ'in kod çözücüsünde kontrol ettim ve her iki durumda da aynı şeyi aldım Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
Ayrıca, bu yanıtta verilen yöntemi kullanarak her iki durum için de kodu söktüm . Sadece cevapla ilgili kısımları göstereceğim
Dış döngü durumda
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;
İç döngü durumda
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;
Eğer dikkat ederseniz, sadece Slot
atanmış i
ve intermediateResult
içinde LocalVariableTable
geçiş sırasına ürünü olarak takas edilir. Yuvadaki aynı fark diğer kod satırlarına da yansır.
- Ekstra işlem yapılmıyor
intermediateResult
her iki durumda da hala yerel bir değişkendir, bu nedenle erişim süresi farkı yoktur.
BONUS
Derleyiciler bir ton optimizasyon yapar, bu durumda ne olduğuna bir göz atın.
Sıfır çalışma çantası
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Sıfır iş ayrıştırıldı
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}