编译时间难以置信

时间:2016-09-28 03:05:30

标签: xcode swift3

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

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

我跟着this进行了调查:

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

  2. 构建项目

  3. enter image description here

  4. enter image description here

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

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


    导致这些长编译时间的原因是什么?

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

8 个答案:

答案 0 :(得分:37)

更新1:

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

更新2:

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

更新3:

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

更新4:

我可以确认取消选中这两项Dependency check 会缓解一段时间的痛苦,Xcode 8 bug似乎与检查文件之间的依赖关系有关。

更新5:

我已将代码库从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 varsclosures。在连接字符串等时不要使用+ operatorsee 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
    ]

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

enter image description here

然后我将其改为:

    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!