Programming/Swift

[Swift] for-in VS forEach 속도와 메모리 관점 비교

guswlsdk 2025. 3. 11. 20:36
반응형

Objective

  • 반복된 동작을 위해 주로 for in 또는 forEach를 주로 사용해 왔다.
  • 가끔 알고리즘 문제를 풀곤 할 때 forEach 문을 사용했을 때 시간 초과가 발생했던 적이 있어서 둘 중 for in이 더 빠르다고 느껴왔다.
  • 경험으로 인해 그렇다고 느껴왔던 것이지 의문만 가지고 실제 두 차이를 알아보려고 시도하진 않았던 것 같다. 

for-in과 forEach 중 어떤 것이 속도와 메모리 측면에서 성능 분석 후 어떠한 상황에서 사용하는 게 적합한지 알아보자

 

 

 Key Result

  • KR1 - 어느 것이 속도가 더 빠른지 비교한다.
  • KR2 - 어느 것이 메모리 사용량이 적은지 비교한다.
  • KR3 - 각각 어떠한 상황에서 사용하는 것이 적합한지 분석한다.

 

 

KR1 - 속도 비교

import Foundation

let numbers = Array(1...100_000_000)

func measureTime(_ block: () -> Void) {
    let start = CFAbsoluteTimeGetCurrent()
    block()
    let end = CFAbsoluteTimeGetCurrent()
    print("Elapsed time: \(end - start) seconds")
}

print("For-in Loop:")
measureTime {
    for number in numbers {
        _ = number * 2
    }
}

print("forEach:")
measureTime {
    numbers.forEach {
        _ = $0 * 2
    }
}

 

 

 

for-in : 6.606초
forEach : 6.623초

for-in이 더 빠르다.

 

 

KR2 - 메모리 비교

정량적으로 비교할 수 있을만한 코드를 만들진 못 하였다...

 

그러나 forEach는 클로저를 사용하므로 호출이 발생할 때마다 새로운 스택이 생성되는 점과 클로저 내부에서 self 또는 참조 타입 캡처 등으로 인한 ARC 오버헤드가 발생할 수 있다는 점을 고려하면 forEach는 for-in보다 메모리를 더 많이 사용할 가능성이 높다.

 

 

KR3 - 어느 상황에 뭘 써야할까?

  • for - in
    • 반복문 중 break 또는 continue 등 제어가 필요한 경우
    • 유의미한 성능 차이는 아니지만 코딩 테스트, 알고리즘 문제 처럼 성능을 최대한 고려해야 하는 상황일 경우
    • enumerated() 등 인덱스 접근이 필요한 경우
  • forEach
    • 코드가 간결하고 단순한 작업이 이루어지는 경우(for-in보다 가독성이 높아질 수 있음)
    • 처음부터 끝까지 순회가 이루어지는 경우(return으로는 반복문 후속 호출을 탈출할 수 없다.ex) 중첩 반복문 등)
    • break, continue가 필요 없는 경우

 

 

결론

유의미하진 않지만 for-in이 성능이 더 좋지만 굳이 고집할 필요까진 없으며 각각 상황이나 스타일에 맞게 사용하면 되는 것 같다.

반응형