Xcode 8 Long Compile Time

Xcode 8 has some interesting quirks when compiling. I hypothesize that it is part of the type interpolation system.

Takes the following code, for example:

  
var description: String {
    get {
      let desc = String("\(summary ?? "")\n \(narrative ?? "")\n Start: \(start?.dateString ?? "") End:  \(end?.dateString ?? "")\n \(location ?? "") \n \(htmlLink ?? "")")
    return desc
    }
  }

This is fairly simple string manipulation, where I assume the compiler is converting to something like (I’ve removed the ‘else’ clause for readability):

  
var description: String {
    get {
      var desc = ""
      if summary != nil {
        desc = desc + "\(summary!)\n"
      }
      if description != nil {
        desc = desc + "\(narrative!)\n"
      }
      if start != nil {
        desc = desc + "Start: \(start!.dateString) "
      }
      if end != nil {
        desc = desc + "End: \(end!.dateString)\n"
      }
      if location != nil {
        desc = desc + "Location: \(location!)\n"
      }
      if htmlLink != nil {
        desc = desc + "\(htmlLink!)\n"
      }
      print(desc)
      return desc
    }
  }

However, while the latter takes about 1.3ms to compile on my machine, the former takes almost 40 seconds.

I imagine this is a temporary glitch, but it’s worth checking to save yourself many minutes per day in compile time.

To check your compile times, add a build setting to your target:

Other Swift Flags $(inherited) "-Xfrontend" "-debug-time-function-bodies"

Then the time taken to compile each file will be available in Xcode’s Report Navigator (the rightmost navigator).

Quick way to discover the culprits:

@nickoneill
Choose ”Copy transcripts for shown results”, then in Terminal:

pbpaste | egrep ‘\.[0-9]ms’ | sort -t “.” -k 1 -n | tail -10

— Erik Aderstedt (@erikaderstedt) April 27, 2016