编译时间令人难以置信的慢
我的项目由〜350 Swift文件和〜40cocoa豆依赖项组成。
整个项目一旦迁移到Swift 3
,构build时间就会慢得多,并花费3分多钟才能完成编译。
我注意到,如果我没有改变任何文件重build,它build立在一个合理的时间内。 但是,如果我添加一个新的function,它需要3分钟以上。
Cocoapods似乎不会造成这个问题,因为它延迟了Compiling Swift source files
状态。
我跟着这个来调查:
-
我的目标的构build设置中的
Other Swift Flags
添加了-Xfrontend -debug-time-function-bodies
标志 -
build立这个项目
-
-
-
复制到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 8
和Swift 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 vars
或closures
,迅速不喜欢。 连接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)"
- 当应用程序处于前台时显示本地通知Swift 3
- DateFormatter不返回“HH:mm:ss”的date
- Swift 3:expression式隐式地从“UIView?”强制转换 去任何
- Swift 3.0调用结果未使用
- CGRectMake,CGPointMake,CGSizeMake,CGRectZero,CGPointZero在Swift中不可用
- “++”和“ – ”运算符已被弃用Xcode 7.3
- 如何使用Swift 3.0中的NotificationCentre和Swift 2.0中的NSNotificationCenter传递数据?
- 在Swift 3中删除preferredStatusBarStyle?
- 快速sorting3