WWDC16에서 발표한 Understanding Swfit Performace
Agenda
- Allocation
- Reference Counting
- Method Dispatch
- Protocol Types
- Generic Code
이전 글
Generic Code는 Protocol Type과 다른 점은?
context당 하나의 형식입니다. Swift는 Generic type의 T을 호출 측에서 사용되는 Point에 바인딩 합니다.
연속적인 호출에서 바인딩 된 유형은 아래로 전달됩니다.
이러한 것이 매개변수적 다형성(parametric polymorphism)라고 하는 보다 정적인 형태의 다형성을 의미합니다
protocol을 사용할 때와 마찬가지로 하나의 공유 구현이 있습니다.
protocol 및 v-table을 사용하여 해당 함수 내에서 작업을 수행합니다.
context당 하나의 유형이 있기 때문에 Existential Container를 사용하지 않습니다. 대신에 사용되는 유형의 v-table과 pwt을 인수로 전달할 수 있습니다.
해당 함수를 실행하는 동안 매개 변수에 대한 로컬 변수를 만들 때 Swift는 v-table을 사용하여 heap에 필요한 버퍼를 할당받고 복사를 합니다.
지역 매개변수에서 draw 메서드를 실행할 때와 유사하게, 전달된 pwt를 사용하고 테이블에서 고정 오프셋의 draw 메서드를 찾아 구현으로 이동합니다
Swift는 지역 매개변수에 필요한 메모리의 할당은 어떻게 할까요?
stack 혹은 heap에 valueBuffer를 할당 됩니다.
이 정적 형태의 다형성은 제네릭의 전문화라는 컴파일러 최적화를 가능하게 합니다.
정적 다형성을 가지고 있으므로, 한 가지 유형입니다
해당 유형을 사용하여 해당 함수의 버전을 만듭니다.
컴파일러 최적화를 통해 Point 메서드를 drawACopy에 인라인합니다. 이제 drawACopy는 참조되지 않으니 제거하고 Point 혹은 Line의 메서드를 사용하게 됩니다.
call-site에서 유형을 유추할 수 있어야 합니다.
특수화 중에 사용되는 유형과 함수에 대한 정의가 있어야 사용됩니다.
두 파일을 별도로 컴파일하면 UsePoint 파일은 컴파일할 때 Point의 정의를 더 이상 사용할 수 없습니다.
그러나 전체 모듈 최적화를 통해 컴파일러는 통찰력을 가지고 최적화가 발생할 수 있습니다.
Pair는 generic을 통해 같은 유형만 사용되도록 강제할 수 있습니다.
이렇게 되면 런타임에 유형을 변경할 수 없습니다.
따라서 추가적인 heap 할당이 없이 인라인으로 할당됩니다.
구조체 유형을 사용하는 것과 동일한 성능을 가지게 됩니다.
컴파일러 최적화를 더욱 가능하게하고 런타임 실행 시간을 단축할 수 있는 static method dispatch가 됩니다.
클래스 유형을 사용하면 heap 할당 및 인스턴스 생성, 값 전달을 위한 reference counting, v-table을 통한 dynamic dispatch를 발생합니다.
Small Value는 여러 번 언급했듯이 No heap, No reference counting이 되며, dynamic dispatch를 사용합니다.
Large Value라면 reference counting을 발생하고 다시 dynamic dispatch의 기능을 얻을 수 있으므로 코드 전체에서 하나의 일반 구현을 공유할 수 있습니다
따라서 구조체 및 열거형과 같은 값 형식을 사용하여 프로그램에서 엔티티를 표현할 수 있다면 고도로 최적화된 코드를 얻을 수 있습니다.
'Language > Swift' 카테고리의 다른 글
[SwiftUI] WWDC23 Discover Observation in SwiftUI (1) | 2023.09.17 |
---|---|
ARC, Reference Count 그리고 optional unowned (with WWDC21 ARC in Swift) (0) | 2023.08.12 |
[WWDC16] Understanding Swift Performance (2) (0) | 2023.08.02 |
[WWDC16] Understanding Swift Performance (1) (0) | 2023.08.02 |
[Swift] Result 타입 (0) | 2023.05.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!