for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
... // e로 무언가를 한다.
}
for (int i = 0; i < a.length; i++) {
... // a[i]로 무언가를 한다.
}
for (Element e : elements) {
... // e로 무언가를 한다.
}
for-each 문과 전통적인 for 문의 성능 차이는 없다.
컴파일러가 더 최적화된 코드를 생성한다는 점이 다름.
어떻게 최적화 된 코드를 뽑아내는 것인가?
배열에 대한 최적화
// 원본 for-each 문 for (int value : array) { // value 사용 } --- // 최적화 전 (전통적인 for 문) for (int i = 0; i < myArray.length; i++) { int value = myArray[i]; // value 사용 } --- // 컴파일러가 생성하는 최적화된 코드 int[] arr$ = array; int len$ = arr$.length; for (int i$ = 0; i$ < len$; i$++) { int value = arr$[i$]; // value 사용 }
- 배열의 길이를
len$
을 통해 미리 계산- 배열 참조를
arr$
에 저장
- 장점
- 루프 마다 배열의 길이를 확인하는 오버헤드가 감소되고
- 배열 참조를 반복적으로 접근하지 않도록 할 수 있다.
- 최적화 전: 루프마다
myArray
에 참조- 최적화 후 : 한번만 참조
컬렉션에 대한 최적화
// 원본 for-each 문 for (Element e : collection) { // e 사용 } --- // 최적화 전 (전통적인 Iterator 사용) for (Iterator<Element> it = collection.iterator(); it.hasNext(); ) { Element element = it.next(); // element 사용 } --- // 최적화 후 (for-each 문 사용 시 컴파일러가 생성하는 코드) Iterator<Element> it$ = collection.iterator(); while (it$.hasNext()) { Element element = it$.next(); // element 사용 }
- 차이점
- 루프 구조
- 최적화 이전 :
for
루프틑 사용하는 방식- 최적화 이후 :
while
루프를 상요- Iterator 생성
- 최적화 이전 : 루프 초기화 부분에서
Iterator
생성- 최적화 이후 : 루프 외부에서
Iterator
생성- 무슨 의미가 있냐?
Iterator 생성 최적화 부분
- 루프 외부에서 한번만 생성하여 불필요한 객체 생성을 방지한다
- 메모리 사용 최적화, GC 부하 감소에 의의
루프 구조의 단순화
- JVM 과 컴파일러가 더 쉽게 최적화할 수 있는 구조라고 한다.
이건 이해가 안간다. → 사실 지금의 자바같은 경우에는 최적화가 둘다 잘되어 있어 크게 차이가 나지 않을 것 같음.