Xcode 编译时间非常慢
我的项目由大约350个Swift文件和大约40个cocoa pod依赖项组成 整个项目一迁移到Xcode 编译时间非常慢,xcode,swift3,Xcode,Swift3,我的项目由大约350个Swift文件和大约40个cocoa pod依赖项组成 整个项目一迁移到Swift 3,构建时间就变得异常缓慢,需要3分钟多一点的时间才能完成编译。 我注意到,如果我在不更改任何文件后重建,它将在合理的时间内构建。但是,如果我添加一个新函数,则需要3分钟以上的时间。 Cocoapods似乎没有引起问题,因为它延迟了编译Swift源文件的时间 我跟踪调查: 将-Xfrontend-debug time函数体标志添加到我的目标构建设置中的我的其他Swift标志 建设项目 将
Swift 3
,构建时间就变得异常缓慢,需要3分钟多一点的时间才能完成编译。我注意到,如果我在不更改任何文件后重建,它将在合理的时间内构建。但是,如果我添加一个新函数,则需要3分钟以上的时间。
Cocoapods似乎没有引起问题,因为它延迟了
编译Swift源文件的时间
我跟踪调查:
将-Xfrontend-debug time函数体
标志添加到我的目标构建设置中的我的其他Swift标志
建设项目
将其复制到终端并运行pbpaste | egrep'\.[0-9]ms'| sort-t'.-k1-n | tail-100
然而,我没有看到任何令人担忧的事情。编译时间最长的文件只有250ms。第二个最接近的是100毫秒,即使所有350个文件都需要250毫秒来编译,那也只需要73秒,这与我所看到的3分钟以上的构建时间相去甚远
是什么导致编译时间过长?
在更新到Xcode 8
和Swift 3
更新1:
我创建了一个新项目,没有运行Swift 3
转换,导入了Swift 3
文件,但构建时间保持不变
更新2:
我已经尝试了SWIFT\u WHOLE\u MODULE\u OPTIMIZATION=YES
,但一旦您对多个文件进行更改,增量构建就会失败,并触发持续4-5分钟以上的重新构建
更新3:
我现在已经将我的整个代码库从swift3
重新编写为swift2.3
。这没有任何区别,问题在于Xcode 8
编译器
更新4:
我可以确认取消选中这两个选项
将缓解一段时间的痛苦,xcode8
bug似乎确实与它如何检查文件之间的依赖关系有关
更新5:
我已经将我的代码库从Swift 2.3
转换为Swift 3
,因为Xcode 8.2
beta版需要它,所以beta版应该包含一个修复程序,用于“当只发生了小的更改时,Xcode不会重建整个目标。(28892475)”。遗憾的是,他们还没有修复这个bug,我的编译时间与Xcode 8.2 Beta版的编译时间完全相同
原职:
我没有足够的声誉发表评论,但我仍然想分享一些资源。我已经被困在这种痛苦中好几天了,升级到swift3
是一场彻底的灾难
我用它来跟踪慢文件,尽管和你一样,这不是我的问题。xcode中的其他内容实际上需要4分钟才能完成:
我还确保没有任何swift不喜欢的惰性变量
或闭包
。连接字符串等时,不要使用+运算符
。
如果我发现任何问题,我会更新这个答案,使用Swift 3
ATM几乎不可能有效率。Swift\u整体模块\u优化=是
Xcode版本:8.1 GM
要添加,请选择目标,然后转到编辑器>添加生成设置>添加用户定义设置
,并添加上述内容
我的干净构建时间从35分钟下降到了8分钟,项目文件数为800
注意:首先在Xcode 8.0上尝试了这个,但没有成功。我使用的是Xcode 8.1,我的问题是字典使用了Nil合并运算符
这是我花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
希望它能帮助你们中的一些人。我将一个包含17个文件的Swift 2x项目迁移到Swift 3,在所有文件中有28个警告和55个错误。编译时间为4-5分钟
禁用
Find Implicit Dependancies
计划和
SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
只做了一些小的改进
当我最终清除每个文件中的警告和错误时,编译时间缩短了,现在只需几秒钟。IDE恢复了应有的性能—几乎实时地检测错误并快速编译
首先,编译器似乎正在重新编译(或至少交叉检查)每个文件,但有任何错误或警告-即使自上次编译以来您尚未编辑该文件
第二,如果文件之间有太多的依赖错误/警告,编译器就会出现瓶颈并立即减慢速度 我发现有几种编码风格需要花很多时间在Swift中编译(2.3,未在3上测试):
应该是
a = a + b
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)
还要将阵列添加到一起:
var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c
应该是
a = a + b
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中的速度似乎非常慢:
item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")
~编译耗时8-10秒
item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
~1,6秒完成编译
item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
~0001秒编译时间每当您遇到编译速度慢的问题时,closly会查看您应用程序中包含的第三方SDK,并尝试找到您的编码技术
item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
我在我的应用程序中遇到过两次这个问题,我觉得连接多个字符串也会导致编译时间增加,例如,在我的情况下,我的编译时间非常高,因为这行代码:
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!
在Xcode 8中,我也经历过稍微慢一点的构建时间,但并没有达到这个程度。只是想知道。。。您电脑的规格是什么?@TDM我配备了以下设备:2013年末的Macbook Pro,2.4 GHz Intel Core i5,8GB 1600 MHz DDR3 RAM,运行OS X El Capitan版本10.11.6