使用预编译桥接头文件加速混合语言构建

对混合使用 Objective-C 和 Swift 的 Xcode 项目的构建时间进行检查,这些项目可能包含大型桥接头文件,结果表明 Swift 编译器花费大量时间为项目中的所有 Swift 文件重复处理相同的桥接头文件。在某些项目中,即使 Swift 文件非常小,每个额外的 Swift 文件也会显着增加整体构建时间。

本文将讨论这种编译时成本,以及 Swift 3.1 中如何解决这个问题。

问题

每次编译混合语言目标中的 Swift 文件时,Swift 编译器都会解析项目的桥接头文件,以便使 Objective-C 代码对 Swift 代码可见。当桥接头文件很大且 Swift 编译器多次运行时(如在调试配置中),重复解析桥接头文件的成本可能占整体构建时间的很大一部分。

解决方案

在 Swift 3.1 中,编译器获得了一种新模式来降低这种成本:预编译桥接头文件。启用此模式后,混合语言目标中的每个 Swift 文件不再重复解析桥接头文件,而是只解析一次桥接头文件,并将结果(一个临时的“预编译头文件”或“PCH”文件)缓存并在目标中的所有 Swift 文件之间重用。这利用了与 Objective-C 和 C++ 代码中预编译前缀头文件相同的预编译头文件技术。

在 Swift 项目中,这种模式经过开发和测试,调试构建时间缩短了 30%。加速效果取决于项目桥接头文件的大小,并且该模式不影响全模块优化构建。但是,当在调试配置中迭代时,它可以显着缩短编译时间。

试用

此模式是 Swift 3.1 的一部分,可在 swift.org 上的 nightly snapshots 以及 Xcode 8.3 beta 中使用。它目前是实验性的,必须手动启用;在未来的版本中,如果开发者反馈表明它运行良好并提供显着的加速,则默认情况下将启用它。要在此期间试用它,请安装支持它的编译器,打开项目的构建设置,并将“Other Swift Flags”设置为包含选项 -enable-bridging-pch

Enabling bridging PCH

报告反馈

如果您有包含大型桥接头文件的项目,请尝试使用这种新模式。如果您遇到问题,请在 的错误跟踪系统Apple 的错误报告系统 中提交错误报告。也欢迎通过电子邮件发送到 swift-users 邮件列表邮件列表或在 Twitter 上(提及 #SwiftBridgingPCH)提供一般反馈。

注意:Swift 邮件列表已关闭、存档并替换为 Swift 论坛。请参阅此处的公告。一般反馈的场所是论坛上的 Using Swift 类别。