WWDC16에서 발표한 Understanding Swfit Performace
class, struct, protocol, generic 어떤 타입을 써야 하는지 이번 세션의 설명을 통해 선택하면 될 거 같습니다.
Agenda
- Allocation
- Reference Counting
- Method Dispatch
- Protocol Types
- Generic Code
이전 글에서 이야기 했던 V-Table(Virtual Method Table)은 Protocol에서는 사용하지 않습니다.
PWT(Protocol Witness Table)를 사용하게 됩니다.
Drawable 타입의 배열은 동일한 크기의 Existential Container를 가지게 됩니다. 구성 요소를 보게 되면
- valueBuffer
- vwt
- pwt
Value Buffer는 3 words 넘어간다면 heap에 저장하게 됩니다
allocater : point라면 값으로 저장되며, line이라면 힙에 메모리를 할당하고 메머리에 대한 포인터를 저장합니다.
copy : 지역 변수를 VWT에 저장된 값으로 복사합니다
destruct : 유형에 포함될 수 있는 값에 대한 refCount를 줄입니다
deallocate : 할당 해제합니다
protocol 타입별로 pwt를 가르키는 포인터를 저장합니다
수도 코드로 구현된 예시
ExistContDrawable에 데이터와 vwt, pwt를 저장하는 코드를 보여줍니다
Point라면 stack에 저장되고, Line이라면 heap에 저장됩니다
vwt를 값을 넣어주게 됩니다.
코드가 사용이 끝났다면 할당을 해제합니다
protocol 타입 프로퍼티가 2개 있는 예시
Existential Container가 두 개 생성됩니다.
물론 Line으로 바뀐다면 heap에 저장됩니다.
같은 값을 사용하지만 heap에 저장이 4번 발생하게 됩니다.
Heap을 쓰지만 Reference Counting이 없어서 성능이 저하됩니다.
LineStorage 클래스를 만들어서 Heap 할당이 더 싼 Reference Counting으로 변경합니다.
문제는 값을 변경하면 복사된 부분도 변경됩니다.
Copy-On-Write를 통해서 변경이 생긴다면 새로 생성되면 변경하면 됩니다.
Small Value의 Protocol Type
3 words 이하는 heap 할당도 reference counting도 없습니다.
pwt을 사용하면서 dynamic dispatch를 사용하게 됩니다.
LargeValue의 Protocol Type
heap에 할당되며, 값이 참조를 했다면 reference counting도 발생합니다
Indirect Storage의 Protocol Type
3 words를 넘어서는 경우 복사를 할 때, heap 할당이 많이 발생됩니다.
COW를 통해서 Indirect Storage를 사용하면 힙 할당을 덜 발생하여, referece counting이 발생되더라도 비용이 저렴합니다.
다음 글
'Language > Swift' 카테고리의 다른 글
ARC, Reference Count 그리고 optional unowned (with WWDC21 ARC in Swift) (0) | 2023.08.12 |
---|---|
[WWDC16] Understanding Swift Performance (3) (0) | 2023.08.02 |
[WWDC16] Understanding Swift Performance (1) (0) | 2023.08.02 |
[Swift] Result 타입 (0) | 2023.05.12 |
[Swift]UIAlertController (0) | 2023.01.11 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!