티스토리 뷰

Java

For-each문은 For문 보다 얼마나 빠를까?

사용자 siyoon210 2019. 1. 25. 20:25
반응형

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문을 사용하자!


반응형
댓글
  • 프로필사진 usa852 3. Array(배열) 부분에서 설명과 결과가 다른 것 같은데 셜명이 맞는 건가요? (결과는 for문이 더 빠르게 나와있네요;;) 2020.08.03 11:28
  • 프로필사진 사용자 siyoon210 다시 해봤는데 배열도 일반 for문이 더 빠르게 나오네요. 해당 내용 수정했습니다. 감사합니다~! :) 2020.08.04 10:05 신고
  • 프로필사진 cjki 일반for문에서는 반복적으로 size()메서드를 수행하기때문에 밖으로 뺀후 테스트하는게 올바를것같습니다.
    일반for문에서 linkedList는 get의 시간복잡도가 O(n)이기 때문에 당연히 느릴수밖에없습니다.
    for-each에서는 순차적으로 호출하고있구요
    2021.03.08 12:45
  • 프로필사진 사용자 siyoon210 안녕하세요! 좋은의견 감사합니다.
    for문을 자세히 보시면 실제로 size도 한번만 호출되어서 사용되는것을 보실 수 있습니다. ㅎㅎ (인덱스 i를 선언하고 바로 옆에서요!)

    혹시나해서 for문 밖에서 size를 호출한것과 for문 선언문에서 size를 호출한게 다를지 비교해보았는데요. 유의미한 차이는 없었습니다. :)
    2021.03.08 12:52 신고
댓글쓰기 폼