2017-10-12 38 views
4

我目前正在研究优化我的项目的编译时间。我一直都知道有像整个模块优化的东西,但远离在构建设置中检查出来,我没有深入了解它。用户定义的SWIFT_WHOLE_MODULE_OPTIMIZATION和Swift Optimization Level之间有什么区别?

据我了解:

WMO应导致更快的执行代码,但可以稍微增加编译时间,因为编译整个模块文件作为一个整体,而不是并行编译单独的每个文件。 https://swift.org/blog/whole-module-optimizations/

所以建议设置斯威夫特优化级别:

  • 调试配置设置为None [-Onone]
  • 发布配置设置为 Fast, Whole Module Optimization [-O -whole-module-optimization] ,因为它有最好的编译不是那么重要偶尔发布版本的时间

但后来研究一些技巧,减少编译时间,调试配置的时候,我发现这个用户定义设置:

  • SWIFT_WHOLE_MODULE_OPTIMIZATION = YES(用于调试)
  • SWIFT_WHOLE_MODULE_OPTIMIZATION = NO(用于发布版)

这个设置我的DEBUG编译时间减少了将近一半,但这也让我感到困惑。 我无法找到任何关于此设置以及它来自何处的文档。 (我迅速的编译器的理解是非常基本的,我没有与之前用户定义的设置工作)

每个人都只是建议它减少了编译时没有任何解释为什么,或解释,即不会在与上面提到的Swift Optimization Level有冲突。

据我所知,这个设置为YES应该增加编译时间,因为它看起来启用wmo。 因此我想我对wmo的理解,或者这个特定的设置是错误的。

所以我的问题是:

  1. 是什么Swift Optimization Level设置和SWIFT_WHOLE_MODULE_OPTIMIZATION之间的区别?

  2. 为什么SWIFT_WHOLE_MODULE_OPTIMIZATION减少了编译时间?

谢谢!

回答

3
  1. 的主要区别是,whole-module-optimization指编译器如何优化模块Swift Optimization Level指的是每个文件编译。你可以阅读更多关于Swift Optimization Levelhere的不同标志。
  2. SWIFT_WHOLE_MODULE_OPTIMIZATION改善了编译时间,因为编译器对所有函数,方法和文件之间的关系具有更全局的视图,允许它忽略未使用的函数,优化编译顺序以及其他改进。它还着重于仅编译修改后的文件,这意味着即使激活该标志,如果清理项目并删除派生数据文件夹,第一次运行期间仍然会有更大的编译时间。
+0

谢谢你的回应!我不知道如果我得到它,请耐心等待。正如我理解你的答案: 一般来说wmo减少了编译时间,但是: - 当为每个具有Swift Optimization Level的文件启用它时,它会编译每个构建的每个文件,因此它被认为是不好的选项发展,但它可以发布。 - 当使用'SWIFT_WHOLE_MODULE_OPTIMIZATION'启用它并为每个文件禁用它时,它仅编译更改的文件,因此速度更快。 这是正确的吗? – CatDamon

+0

'-wmo'是一个*模块*选项,它意味着当你启用它时,给编译器一个全局的视野,把所有的文件编译成一个整体。这样可以减少时间,因为编译器知道每个文件上发生了什么变化,以及如何影响其他文件并优化决策以编译所需的所有内容。 * Swift Optimization Level *是一个标志,指出如何处理每个文件,而不管'-wmo'选项是否启用。 ** TL; DR **,是的,你是对的 – jvrmed

相关问题