桥接头中导入的文件数量是否会影响编译时间?

时间:2015-12-10 10:28:50

标签: ios swift

我有一个理论,但我不知道如何测试它。我们有一个相当大的iOS项目,包括大约200个Swift文件和240个obj-C文件(以及相同数量的头文件)。我们仍然使用Swift 1.2,这意味着整个项目都会经常重建。

我注意到每个.swift文件大约需要4-6秒才能编译;在其他项目中,这最多是2个。

现在,我注意到在构建输出中,每个.swift文件都会重复生成头文件中生成的警告,这让我相信swift编译器会重新解析桥接头中包含的所有头文件。由于我们在桥接头中有大约160个import语句,所以这种情况相加。

所以,基本问题:

  • 我们的桥接标头的大小会影响构建时间吗?
  • 有没有办法优化它,所以它只解析一次头文件?
  • Swift 2有同样的问题吗?
  • 优化此功能的其他任何技巧?除了重写Swift中的所有内容外,这个项目对我们来说也是一个劳动密集型项目。

2 个答案:

答案 0 :(得分:2)

我只能谈谈我以前工作场所的经历,这意味着有些事情可能会改变。此外,我不确定这是否有助于你的具体情况,因为你混合了我从未做过的Objective C和Swift,但理论仍然是合理的。

简而言之,是的,桥接头的大小会影响编译时间,而且你为每个文件/包含它解析一次是正确的。

优化这种方法的正确方法似乎是将项目拆分为模块(在某些时候也称为“框架”),因为每个模块都是单独编译的,因此如果没有任何更改,则不会重新编译。

答案 1 :(得分:2)

  

我们的桥接头的大小会影响构建时间吗?

绝对。桥接头中包含的文件越多,编译器解析它们所需的时间就越多。这是预编译头试图修复的内容。 PCH文件已被淘汰,有利于模块。

  

有没有办法优化它,所以它只解析一次头文件?

老实说,我不知道,这取决于您的源文件和依赖项。

  

Swift 2有同样的问题吗?

是的,但在较新版本的Xcode和Swift中编译器优化要好得多。再次强调模块而不是预编译头文件。我应该注意,可以将pch文件直接传递给clang,但这不是一个好主意。

如果可以的话,我会尝试在混合项目中使用pch标头。我还考虑创建预编译库或静态框架,以防止不断重建类。 2013年有一个很棒的WWDC视频介绍模块,我强烈建议观看它。

参考文献: