https://codingfriend.tistory.com/39
지난 글에서 Static Dispatch와 Dynamic Dispatch의 차이와 코드 속도에 대해 배웠다.
어떤 메소드를 호출할 지 결정하는 시점의 차이가 핵심이었다.
Static Dispatch | Dynamic Dispatch |
컴파일 시점 | 런타임 시점 |
코드 성능을 위해선 결국 필요할 때를 제외하고 Static Dispatch를 구현하는 것이 더 효율적인 방법이라는 것을 알게 되었다.
그렇다면 어떻게 더 효율적으로 동적 디스패치를 줄일 수 있을까?
1. final 키워드의 사용
선언을 재정의할 수 없도록 클래스, 메소드 또는 속성 선언에 대한 제한 사항이다.
런타임 오버헤드를 제거하고, 정적 디스패치를 구현한다.
원래 Dynamic Dispatch로 동작하는 것들은 vTable을 확인하고 간접 호출을 해야하는데,
final로 선언된 요소들은 컴파일러가 직접 함수 호출을 내보낼 수 있게 한다.
그래서 더이상 재정의나 상속이 필요없는 곳에 붙여 처음부터 Static Dispatch로 동작하게 만들 수 있다!
2. private 키워드의 사용
한 파일 내에서만 참조되는 것을 보장한다.
private 키워드가 있는 곳에, 컴파일러는 잠재적으로 재정의할 수 있는 모든 선언을 확인할 수 있게 된다.
이 때 재정의되는 곳이 없다면 final 을 자동으로 유추해 Static Dispatch로 동작하게 된다!
한마디로 private 키워드가 붙은 건데, 상속 받아서 오버라이드 하는 곳이 없으면
그냥 바로 Static Dispatch로 알아서 동작하는 것.
3. 전체 모듈 최적화 - WMO(Whole Module Optimization)
컴파일러가 모듈의 소스를 한 번에 모두 컴파일 하도록 한다.
기본적으로 Swift는 각 파일을 개별적으로 컴파일한다.이를 통해 Xcode는 여러 파일을 병렬로 매우 빠르게 컴파일할 수 있다. 그러나 각 파일을 개별적으로 컴파일하면 특정 컴파일러 최적화가 방지된다.
Swift는 전체 프로그램을 하나의 파일인 것처럼 컴파일하고 단일 컴파일 단위인 것처럼 프로그램을 최적화할 수 있다.
-> 이것이 바로 WMO!
이 모드에서 컴파일된 프로그램은 컴파일하는 데 시간이 더 오래 걸리지만 더 빨리 실행될 수 있다고 한다.
그래서 internal 선언만으로도 final을 유추해내 사용된다고 한다!
이 모드는 Xcode 빌드 설정 '전체 모듈 최적화'를 사용하여 활성화할 수 있다고 한다.
참고
https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#reducing-dynamic-dispatch
'Swift' 카테고리의 다른 글
[Swift] Method Dispatch에 대해 (0) | 2022.09.24 |
---|