티스토리 뷰
For-each vs For
자바에서 For-each 문이 전통적인 For문보다 더 빠르다는 정도만 알고 있엇는데, 특별하게 ArrayList에 경우는 오히려 For문이 더 빠르다는 얘기를 듣게 되었습니다. 실제로 얼마나 차이가 나는지 알아보고자 성능 테스트를 시도해보았습니다.
참고로, 여기서 말하는 For-each문과 For문은 아래와 같은 2가지 경우의 반복문을 말합니다.
//For-each문
for (Integer integer : list) {
integer++;
}
//For문
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
integer++;
}
테스트 코드
사이즈가 100인 List를 순차적으로 탐색해보았습니다.
(탐색한 정수값을 1증가시키는 무의미한 코드입니다. 탐색과정을 100번 반복했으며, 이 과정을 100,000번 수행하여서 평균을 내었습니다.)
public class ForeachVsFor {
public static void main(String[] args) {
List<integer> list = new LinkedList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
final int TestCaseNum = 100000;
final int IteratorNumber = 100;
final double foreach = PerformanceTester.calcPerformance(() -> {
for (Integer integer : list) {
integer++;
}
}, TestCaseNum, IteratorNumber);
final double traditionalFor = PerformanceTester.calcPerformance(() -> {
for (int i = 0, size = list.size(); i < size; i++) {
Integer integer = list.get(i);
integer++;
}
}, TestCaseNum, IteratorNumber);
}
}
1. LinkedList
for-each문 = 19,774.56 ns
일반 for문 = 151,597.54 ns
LinkedList에 경우는 For-each문이 압도적으로 빠른 속도가 나왔습니다. 약 7.7배 정도 빠르게 나왔습니다. (list의 사이즈가 커질 수록 더 많은 격차가 예상됩니다.)
(for-each문이 더 빠른이유는 내부적으로 iterator를 사용하기 때문입니다.)
2. ArrayList
for-each문 = 15,405.32 ns
일반 for문 = 14,318.87 ns
ArrayList에 경우는 듣던대로 For문이 좀 더 빠르긴 했습니다만 제가 시행한 테스트에서는 거의 차이가 없었습니다. (듣기로는 ArrayList의 For문은 For-each문 보다 3배 가량 빠르다고 합니다.)
3. Array(배열)
ArrayList가 아마도 인덱스가 존재하기 때문에 For문이 더 빠른건 아닐까 하는 생각에 배열로도 테스트를 진행 해보았습니다.
for-each문 = 14,661.95 ns
일반 for문 = 10,319.81 ns
Array에 경우도 일반 for문이 약 1.4배 더 빠르게 나왔습니다.
결론
(성능을 고려한다면) ArrayList와 Array는 For문을 사용하고, LinnkedList는 For-each문을 사용하자!
'Java' 카테고리의 다른 글
자바(JVM)의 메모리 사용 방식 (T 메모리 구조) (7) | 2019.02.21 |
---|---|
자바의 메소드(함수) 호출 방식 - Call by Value vs Call by Reference (0) | 2019.01.30 |
자바의 Default Method (디펄트 메소드) (3) | 2019.01.21 |
Optional 클래스 - Null 데이터 편하게 다루기 (0) | 2019.01.18 |
Java 예외처리하기 (0) | 2018.12.18 |