Class의 속도가 Struct에 비해 느린 이유가 뭘까?
- Class는 Dynamic Dispatch 방식을 채택해서 함수 결정을 런타임에서 하기 때문임!!!!!!!!1
저게 뭔지 나도 잘 모르니까 이제부터 정리해 보겠음
Dispatch
- 어떤 메소드를 호출할지 결정하는 매커니즘
이게 먼말이냐면 어떤 메서드를 언제 호출할지 경정하는 방법이라는 거임
이런 Dispatch는 두 가지 방법이 존재함
Static Dispatch(정적 디스패치)
- 함수를 컴파일 타임에 결정
얘는 컴파일을 할때 벌써 함수를 결정해버림!
그래서 런타임 시 그냥 실행해버리면 되므로 성능이 상대적으로 좋을 수 밖에 없음
Dynamic Dispatch(동적 디스패치)
- 함수를 런타임에 결정
스위프트에서 Class들은 각자 함수 포인터들의 배열인 vTable(Virtual Dispatch Table)을 가지고 있음.
이 테이블을 참조해서 호출할 함수를 결정하는거임.
그리고 이 과정들이 런타임 시 일어나기 때문에 상대적으로 성능이 나쁨.
근데 성능이 나쁜데 왜 Dynamic Dispatch를 쓰는거임????
주로 참조 타입들이 이걸 쓰는데 왜 쓸까???
그건 상속(오버라이딩)의 가능성이 존재하기 때문
값 타입 친구들은 상속이 가능하고, 오버라이딩이 가능한데 그러면 실행할 때 상속 관계 중 어느 클래스의 함수를 쓸지 모르잖아요?
그래서 이때 table을 참조하여 함수를 결정합니다.
그래서!! 오버라이딩을 위해서는 Dynamic Dispatch가 필요한거임!
그래서 상속이 안되는 값타입은 Static Dispatch를 쓰는거구요!
그리고 Dynamic Dispatch는 OOP의 특징 중 하나인 다형성에 큰 역할을 하기도 하구여!
그럼 어케하면 Class의 성능을 향상시킬 수 있을까?
1. 정적 디스패치(static Dispatch)를 지향하면 됨
단순히 보면 static이 dynamic보다 성능이 좋으니까 static하게 만들어 주면 되지 않을까??
상속을 하지 않는 Class에는 final 키워드를 붙혀 애초에 static으로 동작하게 만들어 주는거임
final 키워드가 붙으면 오버라이딩할 수 없으므로
클래스(메서드, 프로퍼티)를 선언할 때 상속되지 않는 클래스에 final을 붙이면 성능이 향상됨
- final을 붙이면 서브클래스를 만들지 않는다는 것을 명시적으로 표현이 가능함
- final으로 선언된 요소들은 직접 호출(더 빠름), 그렇지 않은 요소들은 vtable을 통해 간접호출(더 느림)
2. 파일 내에서만 접근해도 되면 private으로 선언
- private로 선언해서 아예 접근 범위를 제한하는거임. 그러면→ 컴파일러는 프로퍼티의 오버라이딩 여부 판단
- 그래서 컴파일러가 직접 final로 추론을 하게 만들어서 정적 디스패치로 동작하게끔 할 수 있음.
3. WMO(Whole Module Optimization) 사용
- 모듈 전체를 하나의 덩어리로 컴파일 → internal 에서 컴파일러가 오버라이딩 유무를 추론할 수 있게 함.
원래 컴파일러는 모듈 내 파일을 하나하나씩 컴파일을 하거든요.
그래서 컴파일러가 컴파일 할 때는 파일의 상속 여부를 알 수가 없는거임(컴파일 다하고 까봐야 앎)
그때 WMO을 통해서 전체 모듈을 확인하여 컴파일을 하게 된다면 오버라이딩 유무를 추론이 가능한거임
이를 통해 내부적으로 final 키워드를 사용
근데 이거 기본 접근 제어자인 internal 상태이기 때문에 가능하다고 하며,
public, open일 경우 외부 모듈 접근도 가능해서 WMO가 있어도 동적 디스패치로 동작한다고 함.
음… 접근제어자 또 헷갈리네… 함 봐야할듯
그 외 방법… 은
@inline(__always) 키워드 사용 (사실 잘모름 알아봐야함)
lazy 키워드를 사용해서 필요할 때 사용하기
등이 있다고 합니다..!!!
알려주신분들!
Class의 성능 향상 방법
이는 Swift의 Dispatch 매커니즘과 관련이 있다. 보통 Dispatch라고 하면 Thread와 관련 있는 DispatchQueue를 떠올리게 되는데 이와는 다소 다른, 어떤 메서드를 호출할 것인지 결정하고 실행하는 매커니즘
velog.io
Swift) Dispatch를 이용한 성능 최적화
안녕하세요 :) 소들입니다~~! 오늘은 앞서 공부했던 Dispatch를 바탕으로 Swift 성능 최적화에 대해 공부해볼 거예요! 예전에 어디 머기업 개발자 컨퍼런스를 보는데, 클래스를 선언할 때, 상속되지
babbab2.tistory.com
Dynamic Dispatch와 성능 최적화
많은 객체 지향 언어들이 메소드와 프로퍼티들을 오버라이드 할 수 있도록 허용합니다. Swift도 예외는 아닙니다. 그런데 이렇게 오버라이드를 할 경우, 프로그램은 실제 호출할 함수가 어떤 것
jcsoohwancho.github.io
Increasing Performance by Reducing Dynamic Dispatch - Swift Blog
Increasing Performance by Reducing Dynamic Dispatch - Swift Blog
Get the latest news and helpful tips on the Swift programming language from the engineers who created it.
developer.apple.com
'iOS > iOS 기술 면접' 카테고리의 다른 글
Optional (1) | 2023.11.02 |
---|---|
AnyObject (0) | 2023.11.02 |
Convenience init (1) | 2023.10.31 |
Copy On Write는 어떤 방식으로 동작할까? (0) | 2023.10.31 |
Struct와 Class와 Enum의 차이 (0) | 2023.10.30 |