티스토리 뷰
왜 사용할까?
Debug / Release 최적화 기술
swift/docs/OptimizationTips.rst at main · swiftlang/swift


swift는 기본적으로 각 파일을 개별적으로 컴파일한다.
그래서 WMO(Whole module optimization)은 서로 엮여져 있는 파일들을 하나의 파일처럼 실행한다.
컴파일 시간은 오래걸릴 수 있지만 컴파일 되고 나서는 실행 자체는 빨라질 수 있다.
Dynamic Dispatch / Static Dispatch
- 런타임 시점에 확정(Dynamic) 컴파일 시점에 확정(Static Dispatch)
- Dynamic Dispatch: class
- Static Dispatch: struct, enum
클래스 안에 있는 메서드는 dynamic Dispatch로 동작하지만, final이 붙은 클래스에 있는 함수는 Static Dispatch로 동작한다.
→ Base 머시기..남발하지 말고 생각해보고 사용하기!
override, super을 사용하는 클래스는 dynamic하게 동작하기 때문에 연결고리를 최대한 줄여주는 방법을 고려해보는 것이 좋다.
Dynamic Dispatch
클래스는 기본적으로 메서드와 속성 액세스에 동적 디스패치를 사용
class A {
func someMethod(){
print("Hello")
}
}
class B: A {
//상속받은 메서드는 어느 메서드를 실행할지 런타임때 결정 됨
//따라서 성능상 오버헤드가 발생됨
override func someMethod(){
super.someMethod()
print("World")
}
}
func usingAnA(_ a: A) {
//dynamic dispatch를 통해 호출
a.someMethod()
}
→ dynamic dispatch는 오버헤드 외에도 많은 컴파일러 최적화를 방지하기 때문에 직접 함수 호출보다 느리다.
오버헤드 :어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리
방법1. final을 사용하여 상속을 막기

final 키워드를 사용해서 클래스에 대한 상속을 막아
서로 파일/코드가 영향이 없게, 필요한 것들만 연결고리가 만들어지게 만들어서 최적화를 시킬 수 있다.
접근제어 - private을 사용하여 연결고리를 막기

일반적으로 클래스 안에 생성하는 메서드는 internal이 생략되어있다.
하나의 앱에서 여러가지 targets을 만들 수 있다. ex. 위젯, 키보드 등등..
타겟을 추가할 경우에는 안에서만 동잘 할 수 있도록 Internal키워드를 명세를 해야한다.
Protocol
protocol은 struct도 class로도 채택이 가능하기 때문에 dynamic하게 static하게 동작이가능한데, protocol: AnyObject로 구성하게 된다면 dynamic하게 동작하게 된다.
AnyObject -> 클래스의 인스턴스만 담을 수 있음
let array: [AnyObject] = ["iOS", false, UIImageView()] // error
let array: [AnyObject] = [UIImageView()]'🍎 iOS' 카테고리의 다른 글
| RxSwift vs Combine (0) | 2024.09.10 |
|---|---|
| RxSwift(1) (0) | 2024.07.30 |
| Compositional Layout - CollectionView(System설정) (0) | 2024.07.19 |
| Design Pattern (0) | 2024.07.14 |
| MVVM Pattern(1) (0) | 2024.07.14 |