컴파일 최적화 방법
2024. 5. 5. 13:21ㆍiOS
성능 최적화 하는 방법 및 설정
- 먼저 이런 글을 쓰게 되는 이유는 컴파일 및 빌드 시간이 생각보다 오래 걸린다고 느낄수도 있다. 잘 느끼지는 못할수도 있겠지만 어느덧 느려진것을 느끼게되면 한번 코드를 확인해보면 좋을꺼같다. 작업을 하다보면 생각보다 은닉화를 까먹게 되기도 하면서 놓치는 부분들이 생기게 되는것 같다. 이러한 부분을 알아두기 위함이다.
동적 디스패치 줄이기
- 디스패치의 종류에는 정적(static), 동적(Dynamic)이 있습니다.
- 정적 디스패치는 어떤 메서드를 호출해야 컴파일 시점에 알 수있는 방식이고,
- 동적 디스패치는 메서드를 호출하는 런타임 시점에 알 수 있는 방식입니다.
- 그래서 Dynamic DisPatch 줄이기
실제로 애플에서 제공하는 최적화 관련 문서에서 Dynamic DisPatch를 줄여 성능을 향상시킬수 있다고 한다.
https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#reducing-dynamic-dispatch
Dynamic DisPatch를 줄이려면 어떻게 해야 하겠는가? 상속이 되지 않는 클래스에 final 키워드를 붙여 메소드가 override 되지 않도록 보장함으로써 Dynamic DisPatch를 Static DisPatch로 대체하는 것이다.
다이나믹과 스태틱은?
DisPatch란
DisPatch는 어떤 메소드를 호출할지를 결정하고 어떻게 실행시킬지 결정하는 메커니즘이다. 대표적으로 종류는 2가지가 있다.
- Static DisPatch
- Dynamic DisPatch
- Static DisPatch는 컴파일 타임에 실행할 메소드를 미리 결정한다. 그리고 런타임에 결정한 메소드를 실행한다. Dynamic DisPatch는 함수들에 대한 주소인 포인터를 vtable에 유지한다. 런타임시에 vtable을 참조하여 실행할 메소드를 결정하므로 Static DisPatch에 비해 성능적으로 손해를 보게 된다. 이와 반대로 Static DisPatch는 호출할 메소드를 찾기 위해 추가적인 작업이 필요 없으므로 성능상 이점을 갖는다.
Swift에서 DisPatch
- Swift에서 구조체와 열거형은 값 타입이다. 값 타입은 메소드가 override 되지 않으므로 Static DisPatch을 사용한다.
메모리 적인 이점은 없습니다..
- 오버라이드가 필요하지않으면
final
을 명시final
을 명시하면 런타임때에 호출할 메서드를 찾지 않아도 되기 때문에 정적 디스패치가 된다!
- 프로퍼티 및 메서드에 접근제어자 활용하기
- 기본적으로
private
를 쓰는 습관이 필요로하다. 이렇게 사용하게 된다면 외부 또는 자식 클래스에 오버라이드의 가능성을 배제하기때문에 컴파일때 확인을 해서 정적 디스패치가 되기에 성능 향상이 가능하다.- 기본적으로 프로퍼티 생성시에 타입을 명시하는것이 좋다!
- private var a: Int = 0
- 기본적으로
'iOS' 카테고리의 다른 글
Completion(escaping) 와 Combine (0) | 2025.01.26 |
---|---|
비동기 테스트 (1) | 2024.07.08 |
Concurrency (await) (0) | 2024.04.16 |
스파게티코드 해결방안 고민하기 (3) | 2024.04.15 |
OOP (객체 지향 프로그래밍) (1) | 2024.01.08 |