나는이 같은 질문을 오랫동안했다. 그래서 더 간단한 코드를 테스트했습니다.
결론 : 들어 이러한 경우 가 NO의 성능 차이.
외부 루프 케이스
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);
}
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);
}
제로 작업 디 컴파일
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}