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,00번 수행해서 평균을 내었습니다.)
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);
}
}
LinkedList
for-each문 = 19,774.56 ns
일반 for문 = 151,597.54 ns
LinkedList에 경우는 For-each문이 압도적으로 빠른 속도가 나왔습니다. 약 7.7배 정도 빠르게 나왔내요. (list의 사이즈가 커질 수록 더 많은 격차가 예상됩니다.)
(for-each문이 더 빠른 이유는 내부적으로 iterator를 사용하기 때문입니다.)
ArrayList
for-each문 = 15,405.32 ns
일반 for문 = 14,318.87 ns
ArrayList에 경우 듣던대로 For문이 좀 더 빠르긴 햇습니다만 제가 시행한 테스트에서는 거의 차이가 없었습니다. (듣기로는 ArrayList의 For문은 For-each문 보다 3배 가량 빠르다고 합니다.)
Array(배열)
ArrayList가 아마도 인덱스가 존재하기 때문에 For문이 더 빠른건 아닐까 하는 생각에 배열로도 테스트를 진행 해보았습니다.
for-each문 = 14,661.95ns
일반 for문 = 10,319.81ns
Array에 경우도 일반 for문이 약 1.4배 더 빠르게 나왔습니다.
결론
(성능을 고려한다면) ArrayList와 Array는 For문을 사용하고, LinkedList는 For-each문을 사용하자!
'DevLog > Etc...' 카테고리의 다른 글
퍼포스(P4V)와 깃(Git)의 차이점은 뭘까? (0) | 2021.02.05 |
---|---|
객체지향프로그래밍(OOP) 특징 (0) | 2021.02.04 |
삼각함수(sin, cos, tan) 그래프 (0) | 2021.02.02 |
프로세스와 스레드의 차이 (0) | 2021.02.01 |
TCP와 UDP의 개념과 차이점 & 특징 (0) | 2021.02.01 |