WWDC16에서 발표한 Understanding Swfit Performace
class, struct, protocol, generic 어떤 타입을 써야 하는지 이번 세션의 설명을 통해 선택하면 될 거 같습니다.
Agenda
- Allocation
- Reference Counting
- Method Dispatch
- Protocol Types
- Generic Code
세션에서는 위 3가지의 기준으로 성능에 대해 이야기를 하게 됩니다.
Allocation
프로그램이 실행될 때, 메모리에 저장되어야 하며 그 중에서도 Stack과 Heap 영역에 저장에 대해서 이야기 합니다.
Stack 영역은 컴파일 타임에서 크기가 결정되며, Heap 영역은 런 타임에 크기가 결정됩니다.
성능 차원에서는 Heap보다 Stack이 훨씬 빠르며, Heap은 할당/해제 및 메모리 고려 등 신경쓰는 만큼 속도가 느립니다.
예시에서 코드를 개선하는 것에 대해서 이야기 합니다
해당 코드는 스크롤하는 동안 자주 호출되는 코드라고 했을 때, UIImage를 계속 생성하는 것은 비효율적이기에 캐싱 레이어를 추가합니다.
하지만 String은 Heap에 간접적으로 저장이 됩니다. Attributes라는 struct를 만들고 프로퍼티를 enum으로 구현하여 String 사용하지 않도록 구현했습니다.
Reference Counting
참조 타입에 대해 단순하게 증가/감소만 하는 것이 아니라 여러 스레드에서 동시 참조를 하기에 Thread safety overhead하는 것은 비용이 추가가 됩니다.
Class 예제
point2 인스턴스가 생기면서 refCount가 1에서 2로 증가하게 됩니다. 그리고 사용이 끝나면 해제 되면서 refCount는 줄어들게 되며, Stack 및 Heap 영역에서 메모리 해제됩니다.
Struct 예제
struct는 기본적으로 참조를 가지지 않기에 reference counting이 없지만, 내부적으로 가지게 되는 경우가 있습니다.
String 타입은 heap에 할당될 수 있으며, UIFont는 class이기에 인스턴스에 생성하는 시점에 참조가 생깁니다. 오히려 class보다 비용이 많이 들 수도 있습니다.
레퍼런스가 되는 프로퍼티가 3개가 있습니다.
uuid는 UUID 타입으로 변경, mimeType은 enum으로 변경 하여 개선을 할 수 있음을 보여줍니다.
Method Dispatch
어떤 메서드를 컴파일 타임 및 런 타임에서 호출할건지 결정하여 그것을 실행하는 메커니즘입니다.
static method dispatch 및 dynamic method dispatch가 있습니다.
static method dispatch의 경우에는 런타임에 구현으로 바로 이동하지만, dynamic method dispatch는 런타임에 테이블에서 구현 조회한 뒤 구현으로 이동하면서 성능에서 차이가 발생하게 됩니다.
inlining은 컴파일러가 메서드 호출을 메서드의 바디 부분으로 교체하는 컴파일러 최적화 기법입니다.
static method dispatch 예제
컴파일러는 어떤 구현이 실행될지 알기에 drawAPoint(_:) 메서드를 draw() 내 구현부로 대체하는 inlining입니다.
dynamic method dispatch 예제
dynamic method dispatch는 상속으로 인한 다형성 때문에 필요합니다.
상속을 하면 메서드를 재정의할 수 있게 되면서 컴파일러는 어떤 메서드로 구현할지 문맥을 통해서 알아야 하는 상황이기에 런타임에서 결정하게 됩니다.
클래스로 배열을 만들면 참조로 저장되므로 모두 같은 크기의 참조가 저장되어 있습니다.
인스턴스를 생성할 때 Drawable, Point, Line에 대한 포인터를 저장해 놓습니다. 컴파일러는 어떤 메서드를 실행할 지 type이라는 필드를 확인합니다. 포인트로 적힌 V-Table(Virtual Method Table)에서 메서드을 찾을 수 있게 됩니다.
성능의 비교를 해보겠습니다
final 키워드를 붙이게 되면 Static Dispatch로 동작하게 됩니다
다음 글
'Language > Swift' 카테고리의 다른 글
[WWDC16] Understanding Swift Performance (3) (0) | 2023.08.02 |
---|---|
[WWDC16] Understanding Swift Performance (2) (0) | 2023.08.02 |
[Swift] Result 타입 (0) | 2023.05.12 |
[Swift]UIAlertController (0) | 2023.01.11 |
[Swift] Unit Test (0) | 2023.01.10 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!