ฉันมีคำถามเดียวกันนี้มานานแล้ว ดังนั้นฉันจึงทดสอบโค้ดที่เรียบง่ายกว่าเดิม
สรุป:สำหรับกรณีดังกล่าวมีไม่แตกต่างประสิทธิภาพ
กรณีนอกวง
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
เคสด้านใน
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
ฉันตรวจสอบไฟล์ที่คอมไพล์บนเครื่อง Decompiler ของ IntelliJ และสำหรับทั้งสองกรณีฉันได้เหมือนกัน Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
ฉันยังถอดชิ้นส่วนรหัสสำหรับทั้งสองกรณีโดยใช้วิธีที่กำหนดไว้ในคำตอบนี้ ฉันจะแสดงเฉพาะส่วนที่เกี่ยวข้องกับคำตอบเท่านั้น
กรณีนอกวง
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;
เคสด้านใน
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;
หากคุณใส่ใจอย่างใกล้ชิดSlot
จะมีการสลับเฉพาะสินค้าที่ได้รับมอบหมายi
และintermediateResult
เข้ามาLocalVariableTable
เป็นผลิตภัณฑ์ตามลำดับที่ปรากฏ ความแตกต่างในช่องเดียวกันนั้นสะท้อนให้เห็นในรหัสบรรทัดอื่น ๆ
- ไม่มีการดำเนินการพิเศษใด ๆ
intermediateResult
ยังคงเป็นตัวแปรโลคัลในทั้งสองกรณีดังนั้นจึงไม่มีเวลาเข้าถึงที่ต่างกัน
โบนัส
คอมไพเลอร์ทำการปรับแต่งมากมายดูที่สิ่งที่เกิดขึ้นในกรณีนี้
กรณีการทำงานเป็นศูนย์
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
ศูนย์งาน decompiled
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}