编译时间难以置信地慢

dhi*_*nt4 52 xcode swift3

我的项目包括~350个Swift文件和~40个可可pod依赖项.

整个项目迁移到之后Swift 3,构建时间变得非常缓慢,需要花费3到3分钟才能完全编译.
我注意到如果我在不更改任何文件后重建,它会在合理的时间内构建.但是,如果我添加一个新功能,则需要3分钟以上.
Cocoapods似乎没有引起问题,因为它延迟了Compiling Swift source files状态.

我跟着这个调查:

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

  2. 建立项目

  3. 在此输入图像描述

  4. 在此输入图像描述

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

但是,我没有看到任何令人担忧的问题.编译时间最长的文件只有250毫秒.接下来最接近的是100毫秒,即使所有350个文件都需要250毫秒进行编译,这也只有73秒,这与我看到的3分钟以上的版本相差无几.


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

在更新到Xcode 8和之前,它从未如此缓慢Swift 3.

Ale*_*ing 37

更新1:

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

更新2:

我已经尝试过了SWIFT_WHOLE_MODULE_OPTIMIZATION = YES,但是只要对多个文件进行更改,增量构建就会失败并触发重建,持续时间超过4-5分钟.

更新3:

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

更新4:

我可以确认取消选中这两项 依赖性检查 将缓解疼痛一段时间,该Xcode 8漏洞似乎与它如何检查文件之间的依赖关系有关.

更新5:

我已将我的代码库转换Swift 3Swift 2.3Xcode 8.2beta测试版所需的代码库,测试版应该包含一个修复程序"当只发生很小的更改时,Xcode不会重建整个目标.(28892475)".不幸的是,他们没有修复错误,我的编译时间完全相同Xcode 8.2 Beta.

原帖:

我没有足够的声誉来发表评论,但我仍想分享一些资源.几天来我一直陷入这种苦难中,升级到Swift 3完全是一场灾难.

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

我也确定我没有任何lazy varsclosures那种迅速不喜欢的东西.不要使用+ operator连接字符串等时 看到这个.

如果我找到任何东西,我会更新这个答案,用Swift 3ATM 来提高效率几乎是不可能的.


San*_*lez 18

我正在使用Xcode 8.1我的问题是使用的Dictionary 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
    ]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但它告诉我,字典需要很长时间才能编译.

在此输入图像描述

然后我将其更改为:

    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
Run Code Online (Sandbox Code Playgroud)

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


met*_*tpb 10

SWIFT_WHOLE_MODULE_OPTIMIZATION =是

Xcode版本:8.1 GM

要添加选择目标,请转到Editor > Add Build Setting > Add User-Defined Setting,然后添加上述内容.

我的清洁构建时间从35分钟(Ahem,对不起)下降到8分钟,项目文件数为800.

注意:首先在Xcode 8.0上尝试过这个,但是没有用.


coy*_*yer 10

string concatenation似乎是不可思议的缓慢Swift3/XCode8:

item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")
Run Code Online (Sandbox Code Playgroud)

〜花了8-10秒编译

item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
Run Code Online (Sandbox Code Playgroud)

〜花了1.6秒编译

item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
Run Code Online (Sandbox Code Playgroud)

〜花了0,001秒编译


Ruu*_*ser 5

我发现了一些编码风格,需要花费大量时间在Swift中编译(2.3,未在3上测试):

a += b 
Run Code Online (Sandbox Code Playgroud)

应该

a = a + b
Run Code Online (Sandbox Code Playgroud)

还将数组添加到一起:

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c
Run Code Online (Sandbox Code Playgroud)

应该

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)
Run Code Online (Sandbox Code Playgroud)

最后一次优化将1个方法的编译时间从9800ms提高到5.5ms ......