250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

Swift - WMO 전체 모듈 최적화 본문

Swift 이론

Swift - WMO 전체 모듈 최적화

스윞남 2024. 4. 11. 17:46
728x90
반응형
SMALL

이번 포스팅에서는 앱 최적화에 대해 포스팅 해보겠습니다.

 

 

#WMO : Whole Module Optimization(전체 모듈 최적화)


728x90

https://www.swift.org/blog/whole-module-optimizations/

 

Whole-Module Optimization in Swift 3

Whole-module optimization is an optimization mode of the Swift compiler. The performance win of whole-module optimization heavily depends on the project, but it can be up to two or even five times.

www.swift.org

 

전체 모듈 최적화는 Swift 컴파일러의 최적화 모드입니다. 전체 모듈 최적화의 성능 향상은 프로젝트의 크기에 따라 다르지만 2배 ~ 5배까지 향상될 수 있습니다.

 

단일 파일 컴파일의 경우, 모듈 내 파일들을 하나씩 컴파일하게 됩니다. 결국 파일 내에 컴파일만 이루어지기 때문에 컴파일 시간이 커지게 됩니다.

 

Swift 코드는 최적화할 수 있습니다.

최적화하기 위해 최적화를 활성화해야합니다.

1. -Onone : 최소환의 최적화, 디버그 정보 보존

2. -O : production 코드를 위한 것, 적극적인 최적화, 디버그 정보 손실

3. -Osize : 성능보다 코드 크기 우선

 

Build Setting에서 Optimization을 검색해서 설정을 확인해 볼 수 있습니다. 

 

WMO를 적용하게 되면 하나의 전체 프로젝트를 하나로 인식해서 컴파일하게 됩니다. 각각의 파일이 서로 어떻게 의존하고 관계되어 있는지를 컴파일 과정을 통해서 확인하게 됩니다. 

 

여러가지 장점이 있지만 우선,

1. 단일 파일 컴파일에서 한계를 극복(모듈 전체를 확인)

2. 죽은 함수 찾아내기(non-pulbiec 함수에 대한 분석)

3. 컴파일 최적화(컴파일 시간 단축)

 

wmo를 사용하게 된다면 컴파일러는 모듈 안에 있는 스위프트 파일 전체를 통으로 최적화 시키게 됩니다. 컴파일러가 모듈 안에 함수가 구현된 상태를 모두 확인합니다. 

 

# Reduce Dynamic Dispatch

런타임 성능을 향상시키기 위한 방법으로는 동적 디스패치 줄이기가 있습니다.

 

*Method Dispatch : 컴파일/런타임 둘 중 어디서 이루어지는지 결정

-> 즉, 어디서 이루어지는지에 따라 최적화가 결정

 

1. Static Dispatch(Direct - call) : 컴파일 시에 함수가 호출

2. Dynamic Dispatch(Indirect - call) : 런타임 시에 함수가 호출

 

1. Static Dispatch

런타임에서 판단할 필요가 없어서 성능 상 이점이 있습니다. 또한 값/참조 타입 모두 지원합니다.

ex. 열거형, 구조체

 

2. Dynamic Dispatch

런타임 때 어떤 메서드가 실행이 결정되기 때문에 성능 상 오버헤드가 발생하게 됩니다.

* 재정의 가능성으로 인해 상위/하위 클래스에 메서드를 참조해야 하는지 확인 해야하기에 런타임에서 확인하게 됩니다. 참조타입만 지원합니다.

ex. 클래스

 

즉, 런타임 시 함수 호출에 있어 동적 디스패치를 줄여 런타임의 성능을 향상시키자는 것을 말합니다.

런타임 시에 결정되는 함수가 쓰이지 않는다면 private를 붙이거나, final을 붙여 static하게 바궈 성능을 향상시킬 수 있게 해야합니다.

 

 

1. Access Control : 외부 파일에서 액세스할 필요가 없는 경우

- private

- fileprivate

 

프로퍼티, 메서드 선언 시에 fileprivate, private를 앞에 붙여 접근 제어를 걸 수 있습니다. 컴파일 시에 한 줄씩 코드를 읽으면서 다른 파일과 각각 연관관계가 있는지 인식하고, private일 경우에 서로 고려하지 않아도 되기에 WMO시 내부적으로 성능이 좋아지게 됩니다.

 

모듈 간에도 internal을 통해 선언되었다면 외부 접근이 불가능하기에 컴파일러가 알아서 모듈 외부에서 final이라고 유추합니다.

 

2. final : 재정의 할 필요가 없다는 것을 알고 있는 경우 상속 방지

상속하지 않는 클래스 앞에 final 키워드를 붙여 static dispatch로 사용합니다. 위와 마찬가지로 컴파일 시에 인식할 수 있게 됩니다.

 

3. Protocol : 프로토콜 적용 범위

프로토콜을 선언 시에 어느 클래스까지 적용할 수 있게 할 건지 제한을 둬야합니다. 프로토콜 채택을 클래스로만 제한 할 수 있는데, 클래스 전용 표시하는 것의 이점이 컴파일러가 클래스만 프로토콜을 채택한다는 지식을 기반으로 프로그램을 최적화 할 수 있다는 것입니다.

>> 해당 지식이 없다면, 구조체도 프로토콜을 채택할 수 있다고 가정해야하기 때문에 비용이 많이 들기 때문입니다.

 

 

 

 

오늘은 WMO 전체 성능 최적화에 대해 알아보았는데요,, 저도 공부하면서 이해가 안됐던 부분이 많았지만 계속 반복하고 있습니다!!

아직 갈길이 많이 남았지만 더 열심히!! 아자아자!!

 

 

# 참고


https://roniruny.tistory.com/238

 

[Swift] WMO - Swift 성능 최적화

https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#protocols GitHub - apple/swift: The Swift Programming Language The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub. github.com 고성능 S

roniruny.tistory.com

https://brunch.co.kr/@joonwonlee/14

 

WMO  알아보기(컴파일 최적화)

Whole-Module Optimization in Swift 3 | 팀내에서 빌드 속도와 관련되어 여러가지 연구를 하고 있는데요. 그중에 기본이 되는 컴파일러 이해와 관련해서 wmo에 대해서 swift.org에 올라온 글을 번역 및 요약해

brunch.co.kr

 

728x90
반응형
LIST

'Swift 이론' 카테고리의 다른 글

Swift - Realm  (0) 2024.04.12
Swift - ReactiveX(RxSwift)  (2) 2024.04.12
Swift - Concurrency  (0) 2024.04.11
Swift - GCD  (0) 2024.04.11
Swift - MVC to MVVM 개념정리/클린아키텍쳐(Swift UIkit Fundamental)  (0) 2024.02.06