성능최적화 - dynamic dispatch편
Swift는 어느 객체지향 언어와 마찬가지로 상위클래스의 메서드, 속성을 재정의 할 수 있습니다. 이는 런타임 중 메서드나 속성을 간접적으로 호출한다는 뜻과 같습니다. 이전 포스팅에도 언급 했지만 dynamic은 런타임 중 함수 호출이 필요할 때 vtable을 참조해 함수를 호출하기 때문에 static에 비해 성능이 떨어집니다. 즉, 성능 최적화를 위서는 dynamic 보다는 static dispatch를 사용하는 것이 좋습니다
핵심은 static dispatch를 늘리기
dynamic dispatch 비중을 줄이면 성능향상을 기대할 수 있습니다 dynamic dispatch는 상속을 통해 함수, 속성의 재정의 여지가 있을 때 사용되는 방식입니다. 따라서 final 키워드를 사용해 재정의를 하지 않는다고 명시하거나 value타입인 struct, enum등을 사용하면 static dispatch 비중을 늘릴 수 있습니다.
또한 private으로 선언하면 컴파일러가 재정의한 부분이 없는지 확인한 후 static dispatch로 동작하게 합니다
protocol은 dynamic dispatch이다
protocol은 선언부만 작성되어 프로토콜을 채택하는 곳에서 함수가 정의되기 때문에 dynamic dispatch방식입니다
extension은?
struct 같은 value type의 extension은 상속 가능성이 없기 때문에 static Dispatch로 동작합니다
class의 경우 extension시 오버라이딩이 불가능 하므로 extension에서 정의된 메서드와 프로퍼티들은 변경되지 않음이 보장된다는 점이 있습니다. 따라서 static Dispatch로 동작한다는 특징이 있습니다
참고자료
https://developer.apple.com/swift/blog/?id=27
https://jcsoohwancho.github.io/2019-11-01-Swift%EC%9D%98-Dispatch-%EA%B7%9C%EC%B9%99/
'🍎iOS프로그래밍' 카테고리의 다른 글
vision OS 맛보기 - Xcode에서 vision OS 앱 체험하기 (0) | 2023.09.01 |
---|---|
iOS- 네트워크로 데이터를 불러올때 data(contentsOf:)메서드를 사용하면 안되는 이유 (0) | 2023.08.21 |
Swift - [성능최적화]final 키워드를 알아보자(static dispatch, dynamic dispatch) (0) | 2023.08.07 |
Xcode - 오류, Package.resolved file is corrupted or malformed 해결하기 (0) | 2023.06.02 |
댓글