dhint4
dhint4

Reputation: 1152

Compile Time Incredibly Slow

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.

Upvotes: 54

Views: 24006

Answers (8)

Mario Jaramillo
Mario Jaramillo

Reputation: 567

Concatenating several Strings also can cause increasing compiling times, for example in my case, my compilation times where very high because of this line:

let fecha = post.dia + " " + post.num_dia + " " + post.mes + " - " + post.hora

When i changed the code to this, it satart compiling in seconds:

var fecha = post.dia!
fecha = fecha + " "
fecha = fecha + post.num_dia!
fecha = fecha + " "
fecha = fecha + post.mes!
fecha = fecha + " - "
fecha = fecha + post.hora!

Upvotes: 0

I'm using Xcode 8.1 My issue was with Dictionary which uses Nil-Coalescing Operator

this is my code when it takes 10 minutes to build:

    let params: [String:String] = [
        "email": email ?? self.email,
        "clave": password,
        "tipo_documento": documentType?.rawValue ?? self.typeDocument.rawValue,
        "documento": number ?? self.documentNumber,
        "nombre": name ?? self.name,
        "apellidos": lastName ?? self.lastName,
        "fecha_nacimiento": birth?.parse() ?? self.birthDate.parse(),
        "genero": genre?.rawValue ?? self.genre.rawValue,
        "telefono_movil": cel ?? self.cel,
        "direccion": address ?? self.address
    ]

I don't know why but it advertise me that the Dictionary take a long time to compile.

enter image description here

Then I change it to:

    var params: [String:String] = [:]
        params["email"] = email ?? self.email
        params["clave"] = password
        params["tipo_documento"] = documentType?.rawValue ?? self.typeDocument.rawValue
        params["documento"] = number ?? self.documentNumber
        params["nombre"] = name ?? self.name
        params["apellidos"] = lastName ?? self.lastName
        params["fecha_nacimiento"] = birth?.parse() ?? self.birthDate.parse()
        params["genero"] = genre?.rawValue ?? self.genre.rawValue
        params["telefono_movil"] = cel ?? self.cel
        params["direccion"] = address ?? self.address

Hope it could help some of you.

Upvotes: 18

Vaibhav Saran
Vaibhav Saran

Reputation: 12908

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 😡. Both the times reasons were different.

First time I found that I added a library in my app named AASignatureView. Since this lib was added, my compilation time increased like hell. It started taking near 12-15 Mins in running the app on simulator. The issue was resolved after I removed this lib from my code and added VMSignatureView and my compilation time went into normal state.

Second time I faced this issue after making a code of appending several Strings. Both of these below methods turned app's compilation time to hell

a = a + b

and

a += b

Then I changed my code to below way and the problem was solved.

a = "a\(strSometihng),\(strAnother)"

Upvotes: 0

metpb
metpb

Reputation: 533

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.

Upvotes: 10

Alexander Selling
Alexander Selling

Reputation: 531

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.

Upvotes: 37

coyer
coyer

Reputation: 4367

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

Upvotes: 10

Ruud Visser
Ruud Visser

Reputation: 3499

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...

Upvotes: 6

obelisk
obelisk

Reputation: 31

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.

Upvotes: 2

Related Questions