본문 바로가기
Swift

[Swift] Swift의 코드 성능과 Dispatch

by 코딩친구 2022. 9. 25.
반응형

https://codingfriend.tistory.com/39

 

[Swift] Method Dispatch에 대해

Method Dispatch란? "내가 호출할 함수가 무엇인지 결정하는 과정" 가장 쉬운 예를 들어보자. 부모 클래스와 자식 클래스가 있을 경우, class Animal { init() { print("Animal Created") } func makeNoise() { fa..

codingfriend.tistory.com

 

지난 글에서 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