티스토리 뷰
WWDC 2016 > Understanding Swift Performance 를 보다가 명확히 몰랐던 세가지를 알게 되었다.
1️⃣ final 키워드를 붙이면 컴파일이 빨라진다고 알고 있는데 이유가 뭘까?
2️⃣ uuid 필드를 String 타입 vs UUID 타입으로 들고 있는 것 중에 뭐가 더 좋은걸까?
3️⃣ 프로토콜과 달리 제네릭을 쓸 때는 구체타입을 왜 못바꿀까?
[1] final 키워드
--- WWDC 세션 중 Method Dispatch 부분에 나오는 내용 ----
✓ static dispatch: 컴파일 타임에 어떤 구현이 실행될 건지 알 수 있음
✓ dynamic dispatch: 런타임에 어떤 구현이 실행될 건지 알 수 있음
static dispatch 인 경우, 컴파일러는 여러 기법 (ex. 인라이닝) 을 통해 최적화를 할 수 있으므로
속도, 성능이 더 좋다.
클래스는 기본적으로 dynamic dispatch 를 사용한다. (다형성 때문에)
하지만 final 키워드를 붙이면 컴파일러는 static dispatch 를 한다.
그러므로 상속, 서브클래싱이 필요하지 않으면 final 키워드를 의도적으로 추가하는 것이 좋다.
(참고: swift/OptimizationTips > Reducing Dynamic Dispatch 에도 관련 내용이 나옴)
[2] uuid 필드 > String 타입 vs UUID 타입 ?
--- WWDC 세션 중 Referece Counting 부분에 나오는 내용 ----
--- 우선 String은 struct (value type) 이지만 heap 영역에 할당된다는 것을 알아야지 혼란이 없습니다. (참고1 | 참고2) ---
아무리 struct 를 사용한다고 해도 그 안에 reference type을 많이 들고 있으면
heap allocation, reference counting 에 대한 비용을 많이 지불하게 될 것이다.
아래의 예제 처럼 말이다!
We can do better!!
먼저 uuid 필드를 String 이 아니라 UUID 타입으로 바꿔서
하나의 heap allocation 를 줄였다.
또한 mimeType 필드도 enum 타입으로 바꿔서
또하나의 heap allocation을 줄였다.
===>
두 스타일의 코드를 다 봤는데,
1번이 더 좋은 선택이라고 할 수 있다.
struct Hello1: Equatable {
let id: UUID = UUID()
}
struct Hello2: Equatable {
let id: String = UUID().uuidString
}
[3] 구체타입 변경 > 프로토콜 O, 제네릭 X
--- WWDC 세션 중 '클래스 말고 프로토콜, 제네릭으로 다형성을 구현하자~' 부분에 나오는 내용 ----
프로토콜을 쓴 경우, 구체타입을 바꿀 수 있지만
제네릭을 쓴 경우, 구체타입을 못바꾼다.
그 이유는 다음과 같다.
✓ Protocol - Dynamic polymorphism
✓ Generic - Static polymorphism
# Protocol
dynamic dispatch 방식. 하지만 클래스처럼 v-table을 쓰는 것은 아니고 protocol witness table 을 사용한다.
(추가적으로 existential container, Value Witness Table 등이 등장함)
# Generic
컴파일러 최적화를 가능하게 하는 정적형태의 다형성.
existential container 를 안쓰는 등 프로토콜과 dispatch 방식이 다르다고 함.
여기 내용이 너무 길고 복잡해서 제대로 이해못함 @_@
어쨌든
두 방식이 비슷해보이지만
내부 동작은 차이가 있었던 것이군,,,
=====
마지막으로 summary 첨부!
위의 WWDC 를 너무 잘 정리해주신 블로그 글 도 추천!
'🍏 > Swift' 카테고리의 다른 글
[Swift] Sendable (0) | 2023.04.08 |
---|---|
[Swift] withTaskGroup, withThrowingTaskGroup (0) | 2023.03.17 |
[Swift Collections] deque (1) | 2022.10.08 |
[Swift] some, any 키워드 (2) | 2022.07.16 |
[Swift] LazySequence (1) | 2022.05.25 |
- Total
- Today
- Yesterday
- DRF APIException
- flutter build mode
- Flutter Clipboard
- Flutter 로딩
- ipad multitasking
- Flutter getter setter
- Django FCM
- Django Firebase Cloud Messaging
- flutter dynamic link
- Django Heroku Scheduler
- SerializerMethodField
- Watch App for iOS App vs Watch App
- Dart Factory
- flutter deep link
- METAL
- 플러터 싱글톤
- PencilKit
- 구글 Geocoding API
- 장고 URL querystring
- github actions
- Flutter Text Gradient
- Python Type Hint
- ribs
- cocoapod
- flutter 앱 출시
- Flutter Spacer
- 플러터 얼럿
- drf custom error
- Sketch 누끼
- 장고 Custom Management Command
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |