WMO(Whole Module Optimization) - 전체 모듈 최적화
WMO는 Swift 컴파일러가 제공하는 최적화 기법 중 하나로, 모듈 내의 모든 파일을 동시에 컴파일하여 성능을 극대화하는 방법.
일반적으로 Swift는 개별 파일 단위로 컴파일하지만, WMO를 사용하면 모듈 전체를 한 번에 컴파일하기에 전역적인 최적화 가능.
빌드 시간 단축과 런타임 성능 최적화를 목표로 하며, 특히 앱의 배포(build for release) 시점에 성능을 극대화할 수 있도록 설계.
1. WMO의 원리
일반적으로 Swift 컴파일러는 각 소스 파일을 개별적으로 컴파일 진행.
그러나, 파일 단위로 컴파일할 때는 다른 파일에 정의된 타입, 메소드 등에 대한 정보 사용이 제한적이어서 최적화의 범위가 좁음.
반면, WMO는 모듈 내 모든 파일을 한꺼번에 컴파일하여 전역적인 최적화를 수행할 수 있음.
컴파일 타임에 전체 모듈을 고려하여 최적화 기법을 적용할 수 있도록 하기 때문에 코드 실행 성능을 더욱 향상시킬 수 있음.
WMO가 적용된 경우
- 전역 최적화: 모듈 내의 여러 파일에 걸친 최적화가 가능.
- 인라인화: 컴파일러가 여러 파일에 걸친 함수를 인라인으로 삽입할 수 있어 함수 호출에 따른 오버헤드를 줄일 수 있음.
- 데드 코드 제거: 모듈 전체에서 사용되지 않는 코드를 정확히 파악해 제거 가능.
- 프로퍼티, 메소드 호출 최적화: 모듈 전체의 정보를 알기 때문에 불필요한 메소드 호출을 제거하거나, 호출 경로를 단축.
2. WMO의 주요 특징
- 모듈 단위 컴파일
- 모듈 전체를 한꺼번에 컴파일하기 때문에 모듈 내 파일 간의 상호작용을 최적화.
- 여러 파일에 걸쳐 정의된 타입, 함수, 메소드 등을 효율적으로 관리.
- 런타임 성능 향상
- 함수 인라인화, 불필요한 메소드 호출 제거 등의 최적화를 통해 앱의 실행 성능이 향상.
- 특히, 복잡한 연산이나 함수 호출이 많은 코드에서 효과적.
- 빌드 시간에 따른 차이
- 디버그 빌드(Debug): 디버그 모드에서는 빌드 속도가 중요한 경우가 많아 WMO가 필요하지 않는 경우가 많음.
- 릴리즈 빌드(Release): 릴리즈 빌드에서는 WMO를 사용하는 것이 일반적이며 코드가 최적화되어 앱의 실행 성능 향상.
3. WMO의 장점
- 성능 최적화
- 일반적인 컴파일 최적화 기법을 전역적으로 적용할 수 있음.
- 모듈 내의 함수를 인라인으로 처리하여 함수 호출에 따른 오버헤드를 줄임.
- 모듈 내 사용되지 않는 코드(데드 코드)를 더 쉽게 찾아내어 제거.
- 모듈 내의 프로퍼티 접근과 메소드 호출을 최적화하여 성능을 개선.
- 코드 간소화 및 유지 보수
- 모듈 내 전역적인 코드 분석이 가능하므로, 코드 중복이나 불필요한 코드 제거와 같은 최적화 작업을 쉽게 수행.
- 컴파일러가 더 많은 정보를 활용할 수 있기 때문에, 성능 최적화가 보다 쉽게 진행.
- 빌드 설정에서의 유연성
- 개발 중에는 파일 단위 컴파일 방식으로 빠르게 빌드하며, 릴리즈 빌드에서는 WMO를 켜서 성능 최적화 가능.
4. WMO의 단점 및 고려사항
- 빌드 시간 증가
- 모듈 전체를 한꺼번에 컴파일하므로 컴파일 타임이 증가. (특히 큰 모듈에서 더 뚜렷하게 나타남)
- 디버그 빌드에서의 사용성
- 디버그 빌드에서는 불필요한 컴파일 시간을 추가로 소요할 수 있어 사용을 자제하는 것이 좋음.
- 병렬 처리 감소
- 파일 단위 컴파일 시 여러 파일의 병렬 처리가 가능하지만, WMO를 사용 시 전체 모듈을 한꺼번에 처리.
5. WMO 사용 시기
- WMO를 사용하는 경우
- 릴리즈 빌드(Release Build): 배포용 릴리즈 빌드에서는 성능 최적화가 중요하므로 WMO 활성화로 성능을 극대화.
- 최적화가 필요한 상황: 앱의 실행 성능이 중요하거나, 함수 호출 최적화가 필요한 경우 WMO를 사용하는 것이 좋음.
- WMO를 사용하지 않는 경우
- 디버그 빌드(Debug Build): 디버그 빌드에서는 빠른 빌드가 중요하기 때문에 파일 단위 컴파일이 더 적합.
6. WMO 설정

- Xcode에서 프로젝트 선택.
- Build Settings 탭에서 Code Generation을 검색.
- Compilation Mode의 Release 설정에서 Whole Module Optimization 옵션을 선택하여 활성화.
'Swift' 카테고리의 다른 글
[Swift] Escaping Closure (@escaping) (0) | 2024.04.05 |
---|---|
[Swift] Value and Reference Types (0) | 2024.04.04 |
[Swift] Performance Optimization Tips (0) | 2024.04.04 |
[Swift] final 키워드와 Type에 따른 Dispatch (0) | 2024.04.03 |
[Swift] Access Control (접근 제어) (0) | 2024.04.03 |