1. Static Dispatch를 사용하자
class뿐만 아니라 상속, 오버라이딩 될 필요가 없는 클래스, 메서드, 프로퍼티에 final 키워드를 붙여 Static Dispatch를 통해 성능 향상을 기대할 수 있다.( 저장 프로퍼티의 경우 오버라이딩이 원래 불가하니 의미가 없을 듯 )
Static Dispatch란?
호출할 메서드를 컴파일 타임에 결정하겠다!
런타임때 호출할 메서드를 이미 결정해 놨으니 성능이 좋다!
Dynamic Dispatch란?
호출할 메서드를 런타임에 결정하겠다!
Swift는 Dynamic Dispatch를 지원하기 위해 클래스마다 함수 포인터들의 배열인 vTable(Virtual Method Table)을 갖고 있다.
하위 클래스가 상위의 메서드를 호출할때 vTable을 런타임 시점에 참조하여 실제 호출할 함수를 결정하기 때문에 성능이 떨어진다.
2. 파일 내에서만 접근해도 될 경우에는 private키워드를 붙이자
Static Dispatch와 비슷하게 private키워드가 사용하면 컴파일러가 잠재적으로 private키워드가 참조될 수 있는 곳에서 오버라이드 하고 있는지 판단한다. 이때 오버라이딩이 되고 있지 않다면 스스로 final 키워드를 추론하여 동작한다. ( class에 private키워드를 붙이면 내부의 모든 프로퍼티와 메서드에도 private 키워드가 붙여져 있는 것으로 판단한다 )
3. WMO를 사용하자
WMO를 사용하면 다음과 같은 이점이 있다
1. 컴파일러가 모듈에 있는 모든 함수의 구현을 확인하므로 함수에 대한 최적화를 수행할 수 있다.
2. 모듈 내에서만 사용되는 비공개 함수에 대한 모든 사용을 추론하여 사용되지 않는 함수를 제거하여 최적화를 수행할 수 있다.
Swift의 기본 접근 제한자가 internal이기 때문에 가능한 방식이며 만약 public, open 키워드를 사용할 시 외부 모듈에서도 접근 가능하기 때문에 WMO를 통해 Static Dispatch의 이점을 가져갈 수 없다고 합니다.
공식 문서에 따르면 최대 5배까지 성능 향상을 기대할 수 있다 합니다.
Xcode8부터 프로젝트에 자동 적용되어 있다 하고 현재 Xcode14.2 버전 사용시 자동으로 적용되어 있음을 확인할 수 있습니다.
* WMO에 대한 공식 아티클은 여기에서 확인 가능합니다.
'iOS > Swift' 카테고리의 다른 글
[Swift] Convenience initializer 알아보기 (0) | 2023.02.16 |
---|---|
[Swift] CoW(Copy on Write)의 동작방식 + 메모리 주소 디버깅 (1) | 2023.02.16 |
[Swift] Class, Struct, Enum의 차이점을 알아보자 (0) | 2023.02.09 |
[Swift] 매우 간단하게 함수의 성능을 개선하기(메모리 관리) (0) | 2023.01.30 |
[Swift] 일급객체란? (0) | 2022.04.11 |