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:
Added the
-Xfrontend -debug-time-function-bodies
flag to myOther Swift Flags
in my target's build settingsBuild the project
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
.
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
in scheme and
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.
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
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.
I found a couple of coding styles that take a lot of time compiling in Swift (2.3, not tested on 3):
Should be
Also adding array together:
Should be
The last optimization took the compilation time for 1 method from 9800ms to 5.5ms...
Update 1:
I created a new project without running the
Swift 3
conversion, imported mySwift 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
toSwift 2.3
. It didn't make any difference, the problem lies with theXcode 8
compiler.Update 4:
I can confirm that unchecking these two
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
fromSwift 2.3
sinceXcode 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 withXcode 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
orclosures
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.Also
string concatenation
seems to be incredible slow in Swift3/XCode8:~ took 8-10 seconds to compile
~ took 1,6 seconds to compile
~ took 0,001 second to compile