본문 바로가기
🍎iOS프로그래밍

Swift - [성능최적화]를 해보자 (dynamic dispatch편)

by 둥둥동동# 2023. 8. 8.
728x90

 

성능최적화 - 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/

 

 

728x90

댓글