编译时间令人难以置信的慢

我的项目由〜350 Swift文件和〜40cocoa豆依赖项组成。

整个项目一旦迁移到Swift 3 ,构build时间就会慢得多,并花费3分多钟才能完成编译。
我注意到,如果我没有改变任何文件重build,它build立在一个合理的时间内。 但是,如果我添加一个新的function,它需要3分钟以上。
Cocoapods似乎不会造成这个问题,因为它延迟了Compiling Swift source files状态。

我跟着这个来调查:

  1. 我的目标的构build设置中的Other Swift Flags添加了-Xfrontend -debug-time-function-bodies标志

  2. build立这个项目

  3. 在这里输入图像说明

  4. 在这里输入图像说明

  5. 复制到terminal并运行pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100 pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100

但是,我没有看到任何关切。 花费时间最长的文件只有250ms。 第二个最接近的是100ms,即使所有的350个文件花费了250ms来编译,总共只有73秒,这远离我看到的3分钟以上的版本。

什么可能导致这么长的编译时间?

更新到Xcode 8Swift 3之前从来没有这么慢过。

更新1:

我创build了一个没有运行Swift 3转换的新项目,导入了我的Swift 3文件,但构build时间保持不变。

更新2:

我已经试过了SWIFT_WHOLE_MODULE_OPTIMIZATION = YES ,但是当你对多个文件进行更改时,增量构build失败,并且触发重新构build,这会持续4-5分钟。

更新3:

我现在已经把我的整个代码库从Swift 3重写到Swift 2.3 。 它没有任何区别,问题在于Xcode 8编译器。

更新4:

我可以证实,取消这两个选项 依赖性检查 将缓解一段时间的痛苦, Xcode 8错误似乎与如何检查文件之间的依赖关系。

更新5:

我已经从Swift 2.3中将代码库转换为Swift 3 ,因为Xcode 8.2 beta需要它,beta版应该包含一个修复程序,“当只发生小的更改时,Xcode不会重build整个目标。”(28892475)。 可惜的是,他们还没有修复这个bug,我的编译时间和Xcode 8.2 Beta完全一样。

原文:

我没有足够的评价,但我仍然想分享一些资源。 我被困在这个苦难的日子里,升级到Swift 3已经是一场完全的灾难。

我正在使用它来跟踪缓慢的文件,尽pipe就像你一样,那不是我的问题。 xcode中的其他东西需要4分钟才能完成: https : //github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

我也确保我没有任何lazy varsclosures ,迅速不喜欢。 连接string时不要使用+ operator ,等等。

如果我发现任何问题,我会更新这个答案,使用Swift 3 ATM几乎是不可能的。

我正在使用Xcode 8.1我的问题是使用Nil-Coalescing Operator字典

这是我的代码,当它需要10分钟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 ] 

我不知道为什么,但它告诉我,该词典需要很长时间来编译。

在这里输入图像说明

然后我改变它:

  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 

希望它可以帮助你们中的一些人。

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Xcode版本: 8.1 GM

要添加select您的目标,然后去Editor > Add Build Setting > Add User-Defined Setting ,并添加上面。

我的清理时间从35分钟(艾姆,请原谅)下降到8分钟,项目文件数为800。

注意: 先在Xcode 8.0上尝试了这个,但是没有成功。

我发现了一些编码风格花了很多时间在Swift编译(2.3,未在3testing):

 a += b 

应该

 a = a + b 

同时添加数组:

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

应该

 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) 

最后的优化 1个方法的编译时间从9800ms到5.5ms

在Swift3 / XCode8中string concatenation似乎也很慢:

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

花了8-10秒来编译

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

〜花了1,6秒来编译

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

〜花费了0.001秒才能编译

我将17个文件的Swift 2x项目移植到了Swift 3,并且在所有文件中有28个警告和55个错误。 编译时间是4-5分钟。

禁用

 Find Implicit Dependancies 

在计划和

 SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

只做了小小的改进。

当我最终清除了每个文件中的警告和错误时,编译时间缩短了,现在在几秒钟内。 IDE回到了原来的状态 – 几乎实时地检测错误并迅速编译。

首先,它看起来像编译器重新编译(或至less交叉检查)每个文件的任何错误或警告 – 即使你自上次编译以来没有编辑该文件。

其次,如果跨文件的依赖性错误/警告太多,编译器就会出现瓶颈并放慢速度。

每当遇到缓慢的编译问题时,请仔细查看您的应用程序中包含的第三方SDK,并尝试查找您的编码技术。

我在我的应用程序中两次面对这个问题,我觉得被Swift 3 har困扰。 两个时代的原因是不同的。

第一次,我发现我在我的应用程序中添加了一个名为AASignatureView的库。 自从这个lib被添加以后,我的编译时间就像地狱一样增加了。 它开始在模拟器上运行应用程序近12-15分钟。 从我的代码中删除了这个库,并添加了VMSignatureView ,编译时间进入正常状态,问题解决了。

第二次在创build附加几个string的代码后,我遇到了这个问题。 下面这两种方法都会将应用程序的编译时间变为地狱

 a = a + b 

 a += b 

然后我改变我的代码到下面的方式,问题解决了。

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