ฉันมีคำถามเดียวกันนี้มานานแล้ว ดังนั้นฉันจึงทดสอบโค้ดที่เรียบง่ายกว่าเดิม  
สรุป:สำหรับกรณีดังกล่าวมีไม่แตกต่างประสิทธิภาพ
กรณีนอกวง
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);
}