sanichdaniel의 iOS 개발 블로그
빌드 타임 개선 본문
빌드 타임이 어디서 오래걸리는지 측정해보았다.
Build Settings의 “Swift Compiler - Custom Flags”, “Other Swift Flags” 에서
-Xfrontend -warn-long-expression-type-checking=<limit> 옵션을 추가해주고 빌드해본 결과
== 비교 연산자를 사용하는곳에서 warning이 많이 나왔다.
비교 연산자 타입추론이 오래 걸리는 이유?
비교 연산자 == 은 수많은 곳에서 overload되는 operator이다. (overload: 같은 이름의 다른 메서드들)
swift standard library에서만 73곳에서 overload되고 있고, 커스텀하게 만든 타입들에서도 자주 overload 된다.
operator는 글로벌 함수처럼 호출되기에, 컴파일러는 모든 ==의 overload를 확인해야한다.
즉 자주 overload 되는 모든 operator들에서는 비교연산자와 같은 퍼포먼스 이슈가 있을것으로 보인다.
개선방안
protocol extension의 메서드로 바꿔주기
extension Equatable {
func equals(_ object: Self?) -> Bool {
guard case object = self else { return false }
return true
}
}
메서드인 경우 컴파일러가 타입추론하기 훨씬 쉽다.
컴파일러는 메서드가 호출된 base 타입의 overload만 확인하면 되기 때문이다.
또한 내부적으론 패턴매칭을 이용하여 equality를 비교한다.
패턴매칭은 내부적으로 ~= operator을 사용하는데, == 보단 일반적으로 적게 overload되기에 타입추론이 더 빠르다.
출처
forums.swift.org/t/swift-equality-operator-takes-long-time-to-type-check/41226/8
www.swiftbysundell.com/articles/improving-swift-compile-times
www.cocoawithlove.com/blog/2016/07/12/type-checker-issues.html
'swift' 카테고리의 다른 글
양방향 타입추론 (0) | 2020.10.22 |
---|---|
Operator Overloading (0) | 2020.10.16 |
Pure functions in swift (0) | 2020.10.14 |
일급 시민 함수 - swift (0) | 2020.10.14 |
Identifiable (0) | 2020.10.07 |