-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
class의 성능을 향상 시킬 수 있는 방법을 설명해주세요
- final
- 상속되지 않는 클래스에 final을 붙이면 메소드가 Static Dispatch를 사용하기 때문에
오버헤드가 줄어 성능이 향상 됩니다 - 클래스는 상속이 가능하기 때문에 메소드가 오버라이딩 될 가능성이 있어 Dynamic Dispatch를 사용합니다
- 하지만 final 키워드를 붙이면 클래스의 상속이 불가능하여
메소드의 오버라이딩도 불가능해져 Static Dispatch를 사용합니다 - Dynamic Dispatch는 런타임시 실행할 메소드를 결정하고,
Static Dispatch는 컴파일 타임에 결정하기 때문에 오버헤드를 줄일 수 있습니다
📌 Dynamic Dispatch
- class는 기본적으로 **상속이 가능**하기 때문에
상위 클래스와 하위 클래스 중 어디를 참조해야할지를 **런타임 시점에 결정**합니다
- 런타임 과정에서 **vTable**에서 함수를 찾아 메모리 주소를 '읽고'
그 주소로 '점프' 해야 하기 때문에 성능상 손해가 발생합니다
📌 vTable
- 정의 : 디스패치를 지원하기 위해 프로그래밍 언어에서 사용하는 메커니즘
- **클래스 마다 가지고 있는 가상테이블**을 말하며 **메서드들의 포인터 값을 가지고 있습니다**
- **하위 클래스**는 **상위 클래스의 vTable 복사본**을 가지고,
**오버라이딩**하는 경우에는 **오버라이딩 한 메서드**를 가리키는 **함수 포인터**로 저장됩니다
💁🏻♂️💁🏻♂️ Dispatch가 뭔데요?
Dispatch는 어떤 메서드를 호출할 것인지를 결정하여, 그것을 ‘**실행하는 메커니즘’**입니다.
Static, Dynamic 두 가지 방식이 있습니다
Static Dispatch는 호출할 함수를 컴파일 타임에 결정합니다.
Dynamic Dispatch는 호출할 함수를 런타임에 결정합니다
기본적으로 값타입은 Static Dispatch를 사용하며,
참조타입에서 어떤 Dispatch를 선택하는지는 오버라이딩 가능성에 따라 결정됩니다
그래서 final 키워드를 붙이면 Static Dispatch를 사용하게 되는것 입니다
- WMO
- Whole Module Optimization을 사용하면 성능향상을 기대할 수 있습니다
- WMO는 모듈 전체를 하나의 덩어리로 컴파일하여
internal level에 대해서 오버라이딩 되지 않는 경우 내부적으로 final을 붙여서 컴파일 합니다 - 이는 개발자가 발견하지 못한 상속되지 않는 클래스에 대해
Dynamic Dispatch의 사용을 줄여 성능 향상을 기대할 수 있습니다
🤔 WMO안하면 왜 자동으로 final을 못붙여주는걸까?
- 기본적으로 swift는 파일을 하나씩 컴파일 하기 때문에
서로 다른 파일에서 클래스를 상속했는지
컴파일 타임에 알 수 없어서 final을 붙일 수 없습니다
Metadata
Metadata
Assignees
Labels
No labels