본문 바로가기

Tips

[iOS] Xcode 빌드 시간 줄이는 방법

느려지는 컴파일 타임을 좋아하는 사람은 아무도 없을 것입니다. 컴파일 타임은 개발 속도에도 꽤나 큰 영향을 끼칩니다. 이번에는 컴파일 타임을 조금이나마 향상시키는 방법에 대해 알아보도록 하겠습니다.

1) 컴파일 타임을 정확하게 측정해보기

컴파일 타임을 개선하기 위해서는 먼저 프로젝트가 얼마나 컴파일 시간이 소요되는지 알아야 합니다. 컴파일 타임을 측정하기 위해서 아래의 명령어를 터미널에 입력합니다.

 

defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES

 

샘플 프로젝트를 통해 측정한 시간을 살펴보겠습니다.

 

컴파일 종류 컴파일 시간
일반 빌드 0.025s
클린 빌드 2.636s
초기화 빌드 6.032s

 

일반 빌드는 시간이 매우 짧습니다. 수정된 파일만 다시 컴파일하여 빌드하기 때문입니다. ⌘+⌥+K 를 이용하여 클린 후 빌드를 하게 되면 모든 파일을 다시 컴파일해야 하므로 시간이 더 소요되죠. 가장 명확한 컴파일 타임은 바로 초기화 빌드 입니다. DerivedData 까지 삭제하고 컴파일하는 것이죠.

 

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

 

프로젝트의 정확한 컴파일 시간을 알고 싶다면 초기화 빌드를 한 시간을 측정해야 합니다.

2) 느린 코드에 대한 warning 활성화

Xcode는 컴파일이 정말 느릴 것 같은 코드를 알아낼 수 있는 기능을 가지고 있습니다. 아래의 구문들을 프로젝트의 Build Setting에서 Other Swift Flags 아래에 추가해주면 활성화시킬 수 있습니다.

 

-Xfrontend -warn-long-function-bodies=50
-Xfrontend -warn-long-expression-type-checking=50

 

컴파일 시간에 50ms가 넘어가는 함수나 표현식이 존재하면 노란색 warning 을 표시해 줍니다. 보통은 50ms보다 높은 숫자를 입력하는 것이 좋습니다. 50ms는 참고용으로 설정한 것 입니다.

3) Xcode의 동시 빌드 작업 기능

Xcode의 동시(concurrent) 빌드 작업 기능을 활성화 시킬 수 있습니다. 아래의 명령문을 터미널에서 입력하면 활성화 됩니다.

 

defaults write com.apple.dt.Xcode BuildSystemScheduleInherentlyParallelCommandsExclusively -bool NO

 

이 기능은 Xcode 9.2 (Release Notes) 에서 공개되었습니다. 애플은 이 기능이 더 많은 메모리를 사용하기 때문에 몇몇의 프로젝트는 더 느리게 할 수도 있다고 설명하였습니다. 비활성화 시키려면 아래의 명령문을 터미널에 입력하면 됩니다.

 

defaults delete com.apple.dt.Xcode BuildSystemScheduleInherentlyParallelCommandsExclusively

 

이 기능은 기본적으로 활성화 되어있지 않습니다.

4) 코딩 가이드라인

이제는 간단한 코딩 규칙을 통해 개선시키는 방법을 알아보겠습니다.

 

가능하다면 let, private을 사용하세요.

Xcode는 값의 변경이 없는 변수에 대해서는 var 대신 let 을 사용하라고 알려주고 있습니다. varlet 으로 사용하는 것만으로도 컴파일 타임을 조금 개선시킬 수 있습니다.

 

가능하다면 클래스를 final로 선언하세요.

상속이 필요없다면 final class 로 선언해주는 것이 컴파일 타임에 도움을 줄 수 있습니다.

 

변수의 타입을 같이 선언해 주세요.

코드를 간결하게 짜기위해서 변수의 타입을 명시하지 않는 경우가 많습니다. 하지만 타입을 정의하지 않으면 컴파일러는 타입 추론을 해야만 합니다. 이 수고로움을 대신 덜어준다면 당연히 컴파일 타임은 개선될 것입니다.

 

// 컴파일러가 타입을 추론
var age = getAge()

// 타입을 정의
var age: Int = getAge()

참조

Improve your Xcode (Swift) Compile Time

Increasing Performance by Reducing Dynamic Dispatch

태그