일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- mvc
- MVVM
- 스트럭트
- 세종대학교
- 대표
- SwiftUI
- 학과별커뮤니티
- 이론
- 토이프로젝트
- 딕셔너리
- 반응형
- 협업
- AppStore
- 네트워크
- CS
- RxSwift
- ios
- uikit
- collectionview
- struct
- 디자인 패턴
- forEach
- 프로토콜
- async
- 기초문법
- 구름톤 유니브
- 실습
- WeatherKit
- 앱개발
- swift
- Today
- Total
스윞한 개발자
Swift - WMO 전체 모듈 최적화 본문
이번 포스팅에서는 앱 최적화에 대해 포스팅 해보겠습니다.
#WMO : Whole Module Optimization(전체 모듈 최적화)
https://www.swift.org/blog/whole-module-optimizations/
전체 모듈 최적화는 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
https://brunch.co.kr/@joonwonlee/14
'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 |