我的项目包含~350个Swift文件和~40个可可pod依赖项。
整个项目迁移到Swift 3
后,构建时间难以置信缓慢,需要花费3到3分钟才能完全编译。
我注意到如果我在不更改任何文件后重建,它会在合理的时间内构建。但是,如果我添加一个新功能,则需要3分钟以上
Cocoapods似乎没有引起问题,因为它延迟了Compiling Swift source files
州。
我跟着this进行了调查:
在我的目标的构建设置中为-Xfrontend -debug-time-function-bodies
添加了Other Swift Flags
标记
构建项目
将其复制到终端并运行pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100
然而,我没有看到任何令人担忧的事情。编译时间最长的文件只有250毫秒。接下来最接近的是100毫秒,即使所有350个文件都需要250毫秒进行编译,这也只有73秒,这与我看到的3分钟以上的版本相差无几。
在更新到Xcode 8
和Swift 3
之前,它从未如此缓慢。
答案 0 :(得分:37)
我在没有运行Swift 3
转换的情况下创建了一个新项目,导入了我的Swift 3
文件,但构建时间保持不变。
我已尝试SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
,但只要您对多个文件进行更改,增量构建就会失败并触发重新构建,持续时间超过4-5分钟。
我现在已经将我的整个代码库从Swift 3
重新编写为Swift 2.3
。它没有任何区别,问题在于Xcode 8
编译器。
我可以确认取消选中这两项
会缓解一段时间的痛苦,Xcode 8
bug似乎与检查文件之间的依赖关系有关。
我已将代码库从Swift 3
转换为Swift 2.3
,因为Xcode 8.2
beta需要它,测试版应该包含一个修补程序“Xcode只会在很小的时候重建整个目标发生了变化。(28892475)“。可悲的是,他们没有固定的bug和我的编译时间正好与同Xcode 8.2 Beta
。
我没有足够的声誉来发表评论,但我仍想分享一些资源。我已经被困在这种痛苦中好几天了,升级到Swift 3
已经是一场彻底的灾难。
我正在使用它来跟踪慢速文件,尽管就像你一样,这不是我的问题。 xcode中的其他内容需要4分钟才能完成: https://github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode
我还确保我没有swift不喜欢的任何lazy vars
或closures
。在连接字符串等时不要使用+ operator
。
see this
如果我找到任何内容,我会更新此答案,使用Swift 3
ATM几乎无法提高效率。
答案 1 :(得分:18)
我正在使用Xcode 8.1我的问题是使用Nil-Coalescing Operator
这是我的代码,需要10分钟才能构建:
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
希望它可以帮助你们中的一些人。
答案 2 :(得分:10)
SWIFT_WHOLE_MODULE_OPTIMIZATION =是
Xcode版本: 8.1 GM
要添加选择目标,请转到Editor > Add Build Setting > Add User-Defined Setting
,然后添加上述内容。
我的清洁构建时间从35分钟(Ahem,对不起)下降到8分钟,项目文件数为800.
注意:首先在Xcode 8.0上尝试过这个,但是没有用。
答案 3 :(得分:10)
同样string concatenation
似乎在Swift3 / XCode8中显得非常缓慢:
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秒来编译
答案 4 :(得分:5)
我发现了一些编码样式,需要花费大量时间在Swift中编译(2.3,未在3上测试):
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 ......
答案 5 :(得分:2)
我将一个包含17个文件的Swift 2x项目迁移到Swift 3,并在所有文件中发出28个警告和55个错误。编译时间为4-5分钟。
停用
Find Implicit Dependancies
方案中的和
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
只做了很小的改进。
当我最终清除每个文件中的警告和错误时,编译时间减少了,现在是秒。 IDE回归正常 - 近乎实时地检测错误并快速编译。
首先,看起来编译器正在重新编译(或至少交叉检查)每个文件都有任何错误或警告 - 即使您自上次编译后还没有编辑该文件。
其次,如果文件中存在太多依赖性错误/警告,则编译器会出现瓶颈并减慢速度。
答案 6 :(得分:0)
每当您遇到编译速度缓慢的问题时,请查看您在应用中包含的第三方SDK,并尝试查找编码技巧。
我在我的应用程序中两次面对这个问题,我觉得受到Swift 3的骚扰。两个时代的原因都不同。
我第一次发现我在名为AASignatureView的应用中添加了一个库。由于添加了这个lib,我的编译时间就像地狱一样增加了。在模拟器上运行应用程序时,它开始花费近12-15分钟。从我的代码中删除了这个lib后添加了VMSignatureView,我的编译时间进入了正常状态。
第二次在制作附加几个字符串的代码后我遇到了这个问题。以下两种方法都将应用程序的编译时间变为地狱
a = a + b
和
a += b
然后我将代码改为以下方式,问题就解决了。
a = "a\(strSometihng),\(strAnother)"
答案 7 :(得分:0)
串联多个字符串也会导致编译时间增加,例如,在我的情况下,由于以下原因,我的编译时间非常长:
let fecha = post.dia + " " + post.num_dia + " " + post.mes + " - " + post.hora
当我将代码更改为此时,它可以在几秒钟内完成编译:
var fecha = post.dia!
fecha = fecha + " "
fecha = fecha + post.num_dia!
fecha = fecha + " "
fecha = fecha + post.mes!
fecha = fecha + " - "
fecha = fecha + post.hora!