티스토리 뷰

반응형

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 첨부! 

 

 

 

 

 

반응형

'🍏 > Swift' 카테고리의 다른 글

[Swift] Sendable  (0) 2023.04.08
[Swift] withTaskGroup, withThrowingTaskGroup  (0) 2023.03.17
[Swift Collections] deque  (1) 2022.10.08
[Swift] some, any 키워드  (1) 2022.07.16
[Swift] LazySequence  (1) 2022.05.25
댓글