Compile Time Incredibly Slow

2019-01-30 03:13发布

My project consists of ~350 Swift files and ~40 cocoa pod dependencies.

As soon as the entire project was migrated to Swift 3, build times have been INCREDIBLY slow and took a little over 3 minutes to completely compile.
I've noticed that if I rebuild after not changing any files, it builds within a reasonable amount of time. However, if I add a new function, it takes the 3+ minutes.
Cocoapods does not seem to be causing the problem as it delays on Compiling Swift source files state.

I followed this to investigate:

  1. Added the -Xfrontend -debug-time-function-bodies flag to my Other Swift Flags in my target's build settings

  2. Build the project

  3. enter image description here

  4. enter image description here

  5. Copied this into terminal and ran pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100

However, I didn't see anything of concern. The file that took the longest to compile was only 250ms. The next closest was 100ms, even if all 350 files took 250ms to compile, that would only be a total of 73 seconds which is way off from the 3+ minute builds I am seeing.


What could be causing these long compile times?

It was never as slow before updating to Xcode 8 and Swift 3.

标签: xcode swift3
8条回答
你好瞎i
2楼-- · 2019-01-30 03:19

I migrated a Swift 2x project of 17 files to Swift 3 and had 28 warnings and 55 errors across all files. Compile time was 4-5 minutes.

Disabling

Find Implicit Dependancies 

in scheme and

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

made only minor improvements.

As I eventually cleared the warnings and errors in each file, the compile time reduced and is now in the seconds. The IDE is back behaving as it should - detecting errors in near real time and compiling quickly.

Firstly, it looks like the compiler is recompiling (or at least cross checking) every file with any error or warning - even if you haven't edited that file since the last compile.

Secondly, if there are too many dependant errors/warnings across files, the compiler bottlenecks and slows right down.

查看更多
聊天终结者
3楼-- · 2019-01-30 03:29

Whenever you face slow compilation issue, closly looks the the third party SDKs you included in your app and also try to find your coding techniques.

I face this issue twice in my app and I felt like harrassed by Swift 3

查看更多
够拽才男人
4楼-- · 2019-01-30 03:30

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Xcode version: 8.1 GM

To add choose your target, then go to Editor > Add Build Setting > Add User-Defined Setting, and add the above.

My clean build time dropped from 35 mins (Ahem, excuse me) to 8 mins with a project file count of 800.

Note: Tried this on Xcode 8.0 first, but didn't work.

查看更多
The star\"
5楼-- · 2019-01-30 03:32

I found a couple of coding styles that take a lot of time compiling in Swift (2.3, not tested on 3):

a += b 

Should be

a = a + b

Also adding array together:

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c

Should be

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d : [Int] = []
d.appendContentsOf(a)
d.appendContentsOf(b)
d.appendContentsOf(c)

The last optimization took the compilation time for 1 method from 9800ms to 5.5ms...

查看更多
我想做一个坏孩纸
6楼-- · 2019-01-30 03:33

Update 1:

I created a new project without running the Swift 3 conversion, imported my Swift 3 files, but the build time remains the same.

Update 2:

I've tried SWIFT_WHOLE_MODULE_OPTIMIZATION = YES, but as soon as you make changes to more than 1 file, the incremental build fails and it triggers a re-build which lasts for more than 4-5 minutes.

Update 3:

I've now re-written my entire code base from Swift 3 to Swift 2.3. It didn't make any difference, the problem lies with the Xcode 8 compiler.

Update 4:

I can confirm that unchecking these two Dependency check will alleviate the pain for a while, the Xcode 8 bug does seem to be tied to how it checks dependencies between files.

Update 5:

I've converted my code base to Swift 3 from Swift 2.3 since Xcode 8.2 beta requires it, the beta should include a fix for "Xcode will not rebuild an entire target when only small changes have occurred. (28892475)". Sad to say, they haven't fixed the bug and my compile times are exactly the same with Xcode 8.2 Beta.

Original post:

I don't have enough reputation to comment, but I still wanted to share some resources. I've been stuck in this misery for days, upgrading to Swift 3 has been a complete disaster.

I'm using this to track slow files, even though just like you, that's not my problem. Something else in xcode is taking literally 4 minutes to complete: https://github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

I've also made sure I don't have any lazy vars or closures that swift doesn't like. Don't use the + operator when concatenating strings, etc. see this.

I'll update this answer if I find anything, it's just about impossible to be productive with Swift 3 ATM.

查看更多
ら.Afraid
7楼-- · 2019-01-30 03:33

Also string concatenation seems to be incredible slow in Swift3/XCode8:

item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")

~ took 8-10 seconds to compile

item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"

~ took 1,6 seconds to compile

item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();

~ took 0,001 second to compile

查看更多
登录 后发表回答