Ever since Swift 3 and XCode8 my project compiles quite slowly. Every time I add so much as an empty line to a file, recompiling takes a full minute. When I check the output, there is no particular file that takes very long. (I also used this tool to measure it: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode)
It always appears to compile 4 files at once. The "rythm" is quite steady. Just very slow...
Also: Whenever I open or switch between files, it can take very long till I get autocomplete, or errors/warnings.
What things can I check? I almost feel like there is some flag I set that just drags down the build speed like crazy..
EDIT: This is not a solution to the underlying problem, but I spent some time on moving more code to frameworks. This made a difference (simply because it has to recompile less files every time). This shouldn't be necessary but it got unbearable... I'm of course still looking very much for a proper solution.
Make sure you're not combining arrays like
let combinedArrays = array1 + array2
. There's a known bug as well for type inference here, where Swift wastes time trying to figure out what type thecombinedArrays
should be. Instead,[array1, array2].joined()
should work just as well, and compile far faster.One common practice that slows down compile time is using
Array.append
andString.append
(or their+
operator equivalents). ForString
s, it's better to use a formatted string, so instead ofyou should use
I can't remember the exact speedup, but it was on the order of 10 times for those particular lines. Odds are, thought, that this won't have a noticeable speedup for any but the tinest projects. For example, our project has hundreds of Swift files, as well as many Objective-C ones, and our compile times are often 10 minutes or more, sometimes even when the only change was to a non-Swift file.
I've had the same issue only since upgrading to Swift 3/XCode 8 and it appears to be caused by large array literals, similar to this.
I was able to fix the issue by adding type annotations to the variables being assigned to the array literal, e.g.
instead of
In my case I was using a helper function to save some data in Firebase. That function was returning a dictionary with about 20 elements and it would take about 40 mins to compile. My solution was to initialize an empty dictionary and then add the items one by one to
someDict
. Now it compiles in less than 30 seconds. I hope it helps.Before
After
I was able to greatly reduce my swift project compile times by avoiding the use the Nil-Coalescing Operator and string concatenation.
In otherwords where I had something like:
I changed it to
My compile times have dropped drastically- from 20 minutes to 20 seconds.
A issue with this problem is that we don't know where is the wrong initialization/declaration . A solution that my colleague suggest is to find which function take long time to compile so:
Project
select your targetBuild Settings
->Swift Compiler - Custom Flags
Other Swift Flags
-Xfrontend -warn-long-function-bodies=50
(50 represent the time in milliseconds)after that a warning should displayed as follow:
and after that you know what to do ;)