iOS

Xcode 컴파일 최적화하여 빌드 속도 올리기

devharrry 2020. 1. 19. 17:44

안녕하세요. 

이번 글에서는 Xcode에서 빌드 속도를 조금이나마 향상시키기 위해서 컴파일 최적화할 수 있는 여러 방법들을 소개하려고 합니다. 

목표 

Xcode 컴파일 최적화하여 빌드 시간을 최대한 줄이는 것입니다. 

 

시작 전 환경 설정 

 

- 컴파일 시간을 측정할 수 있도록 타이머 활성화

defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES

- DerivedData 삭제 

rm -rf ~/Library/Developer/Xcode/DerivedData

 

진행하고 Clean -> Build를 진행하면 아래 화면과 같이 컴파일 시간이 나오는걸 보실 수 있습니다.

 

 

1. Xcode New Build System 

Xcode9에서 애플은 Swift로 작성된 새로운 빌드 시스템을 도입했습니다. Xcode10에서는 기본적으로 사용됩니다.

이 새로운 빌드 시스템은 전체 빌드 시간을 줄이는 것이 목표인 시스템입니다.

 

- 설정 방법 

 

2. Architecture Impact 

해당 옵션을 Yes로 설정하면 컴파일러가 하나의 아키텍처에 대해서만 바이너리를 생성하도록 요청하는 옵션입니다. 

 

- 설정 방법

 

3.Compliation Mode

프로젝트에 모든 파일을 빌드할지 수정된 파일만 빌드할지 설정할 수 있는 옵션입니다.

 

의존성이 많은 프로젝트에서는 Incremental 옵션 설정

  • Incremental - 수정된 파일만 컴파일하는 옵션
  • Whole module - 변경 내용에 관계없이 프로젝트 모든 파일을 컴파일하는 옵션

 

4.Optimization Level 

컴파일러에게 빌드를 특정 수준으로 최적화 레벨을 설정할 수 있는 옵션입니다.

 

디버깅을 많이 하지 않는 경우 Optimize for Spped, Fastest를 설정 

디버깅을 많이 하는 경우 No Optimization, None으로 설정

 

 

5.Dependency Management

iOS에서는 2가지 의존성 관리자가 있습니다. (Carthage, Cocoapods)

 

Carthage는 의존성에 대한 라이브러리 소스 코드가 한번만 컴파일됩니다.

Cocoapods는 컴파일될 때 마다 의존성에 대한 모든 소스코드가 컴파일됩니다.

 

여기서는 컴파일러가 빌드를 병렬로 실행하는 방법을 알려드리겠습니다. 

 

1) Build Machine Cores 설정

머신 코어의 수가 빌드를 진행하는데 중요한 역할을 합니다. 

 

기본적으로 Xcode는 일반적으로 머신 CPU 코어 수와 동일한 수의 스레드를 사용합니다. 

그러나 스레드 수를 기본 값 이상으로 늘리면 빌드 시간을 크게 줄일 수 있습니다. 

 

- 현 개발 환경인 아이맥, 맥에서 코어수 확인하기 

sysctl -n hw.ncpu

- 스레드 카운트 수정하기 

defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 8

 

2) Parallel Build Execution (병렬 빌드 실행 활성화)

의존성이 많은 경우 병렬 빌드를 활성화하는 것을 권장드립니다. 

 

- 설정 방법

 

6) Build Hypothesis

Xcode 컴파일러는 프로젝트 소스를 가져와서 트리와 유사한 구조를 형성하여 모듈의 의존성을 정의합니다.

그런 다음 상향식 접근 방식으로 컴파일을 진행합니다.  즉, 가장 의존성이 작은 모듈 먼저 컴파일을 진행합니다.

 

1) 의존성을 최소화

2) 독립적인 모듈을 갖도록 분리 또는 모듈화 

 

이 2가지를 올바르게 수행하면 프로젝트 복잡성에 따라 빌드 성능이 2~3배 향상하게 됩니다. 

 

7.Linking Frameworks

프로젝트에 추가된 모든 프레임워크가 빌드 프로세스 중에 컴파일러에 의해 자동으로 링크되고 고려되어야함을 의미하는 옵션입니다.

(Default 값은 Yes)

 

외부 프레임워크는 아래와 같이 연결해야합니다. (UIKit, Foundation제외)

1)수동으로 Build Phase → Link Binary With Libraries, Target Dependencies에 연결

2)Target Dependency에 연결 

 

외부 프레임워크는 'Link Frameworks Automatically'에 의존하지 않기 때문에 Build Phase에서 수동으로 연결하는 것이 가장 좋습니다:) 

 

- 설정 방법

 

8. Identify Lazy Code 

해당 기능을 사용하면 컴파일 시간이 크게 지연되는 코드 블록을 식별할 수 있는 옵션입니다.

 

- 설정 방법 

 

millisecond 이상 걸리는 함수 또는 표현식에 대한 경고를 발생시킵니다.

// 메소드
-Xfrontend -warn-long-function-bodies=<millisecond>
 
// 표현식
-Xfrontend -warn-long-expression-type-checking=<millisecond>

 

이렇게 설정한 후 빌드를 하면 아래와 같이 Warning이 발생합니다.

 

 

9. dSYM Impact 

dSYM파일은 충돌 보고서 파일이며, 컴파일러는 dSYM파일을 생성하는데 시간이 오래걸리기 때문에 Debug빌드 시 충돌 보고서를 받을 필요 없다면 비활성화하는 것을 권장합니다. 

 

- 설정 방법 

 

참고

https://blog.flexiple.com/xcode-build-optimization-a-definitive-guide