Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟

Posted

技术标签:

【中文标题】Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟【英文标题】:Project-Swift.h file after Swift 3.0 migration is compiling the same functions hundreds of times and taking 7 minutes to compile 【发布时间】:2017-02-13 03:53:17 【问题描述】:

迁移到 Swift 3.0 后,我们的第一次构建时间现在需要 7 分钟,而过去需要 1:20。有谁知道我怎样才能加快速度?

我在一个包含大量 Objective C 文件、大约 640 个 Swift 文件、20 个 Cocoapod 依赖项、一个 Today View 扩展和 UITests 的大型项目中工作。第一次构建后,增量构建只需大约 10 秒。

我在这里运行了出色的构建时间分析器: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode 并附上下面的截图。

似乎大约 20 个类中的几个函数被编译了 631 次。这似乎是问题,但我不知道如何解决它。没有其他函数或类需要很长时间才能自行编译。

几乎所有 7 分钟的构建时间都花在了编译 swift 文件上,直到出现以下输出: 在这一行之后,所有其余的 swift 文件都被编译并在大约 10 秒内运行。

值得注意的是,生成的 project-swift.h 文件有 4500 行长,桥接头有 150 行导入。

【问题讨论】:

您是否尝试过删除派生数据? @dylanthelion 是的。 我遇到了类似的问题。我很幸运,项目中不再使用负责此操作的文件。所以,我可以删除它 我想指出构建时间分析器左侧的列是累积构建时间。而不是 631 * 65.6 毫秒,数学已经为您完成,总共是 65.6 毫秒。 @Robert 我不相信这是真的。它应该以这种方式工作,但事实并非如此。如果它是累积时间,则意味着该文件正在 0.103 毫秒 (65.6 / 631) 内编译。我希望 Swift 编译器能这么快! 【参考方案1】:

这可能不是一个完整的解决方案,但至少是正在发生的事情。因此,您可能有 631 个文件指向 ViewControllerRecycler.swift

假设 ClassA 从ViewControllerRecycler.swift 调用某些东西,ClassC 从ViewControllerRecycler.swift 调用某些东西等等。

如果您关注this 并将调试标志-driver-show incremental 添加到“其他 swift 标志”中,您将看到如下内容:

Queuing ViewControllerRecycler.swift
Queuing ClassA.swift
Queuing ViewControllerRecycler.swift because of dependencies discovered later

然后

Queuing ViewControllerRecycler.swift because of dependencies discovered later
Queuing ViewControllerRecycler.swift because of dependencies discovered later
Queuing ViewControllerRecycler.swift because of dependencies discovered later

类似的东西。例如,当 ClassA 发生更改时,即使它与 ViewControllerRecycler.swift 无关,也会“由于依赖关系”再次排队等待编译。这会导致您的文件被编译很多次。

您可能希望查看以下网站以尝试优化您的代码以更快:

https://spin.atomicobject.com/2016/04/26/swift-long-compile-time/ XCode 8 very slow swift compiling Xcode 8 does full project rebuild http://bits.citrusbyte.com/improving-swift-compile-time/ https://medium.com/@RobertGummesson/regarding-swift-build-time-optimizations-fc92cdd91e31#.8pvjh9p27

也许这些会帮助你编译一点,如果不是非常快的话

【讨论】:

【参考方案2】:

解决了!原来只是一个设置更改,如这里 SO 帖子中所述: https://***.com/a/40370475/1455770

此更改使我的编译时间从 7 分钟缩短到更易于管理的 2 分钟。 Build Time Analyzer 显示每个文件现在只编译一次。我不是 100% 确定为什么这解决了问题,但我注意到在生成 module-swift.h 文件时,编译器现在似乎一次性生成它,而不是一个文件一个文件。事实证明这要快得多。

【讨论】:

哦,太好了。请记得勾选这个作为正确答案,因为它是

以上是关于Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 迁移后的 Alamofire 错误:“无法将 '(URL, HTTPURLResponse)-> (URL)' 类型的值转换为预期的参数类型 'Parameters'”?

Swift 3.0 xCode 8 迁移吊舱

迁移到 Swift 3.0,构建问题

Swift 3.0 静态实例,迁移工具的语法更改 [重复]

将使用 Cocoapods 1.0.1 的 iOS 应用程序从 Swift 2.2 迁移到 3.0

Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)