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이 성능이 더 좋지만 굳이 고집할 필요까진 없으며 각각 상황이나 스타일에 맞게 사용하면 되는 것 같다.
반응형