【问题标题】:What is the difference between User Defined SWIFT_WHOLE_MODULE_OPTIMIZATION and Swift Optimization Level?用户定义的 SWIFT_WHOLE_MODULE_OPTIMIZATION 和 Swift 优化级别有什么区别?
【发布时间】:2018-03-24 04:11:01
【问题描述】:

我目前正在研究优化我的项目的编译时间。

虽然我知道有一个叫做whole module optimization(简称WMO)的东西,但是我害怕在Build Settings中查看它> 因为我还没有真正深入研究它。

据我了解:

WMO 应该会加快代码执行速度,但会稍微增加编译时间,因为它会将整个模块文件作为一个整体进行编译,而不是根据Swift official blog on whole module optimizations 分别并行编译每个文件。

所以建议将 Swift 优化级别设置如下:

  • 对于Debug配置,设置为None [-Onone]
  • 对于 Release 配置,设置为 Fast, Whole Module Optimization [-O -whole-module-optimization],因为对于偶尔的发布版本而言,最佳编译时间并不重要。

但是,在挖掘有关如何减少 Debug 配置的编译时间的提示时,我发现了这个 User Defined 设置:

  • SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 用于调试
  • SWIFT_WHOLE_MODULE_OPTIMIZATION = NO 发布

这个设置将我的Debug编译时间减少了几乎一半

由于我是 Swift 编译器和 用户定义 设置的新手,我试图在 SWIFT_WHOLE_MODULE_OPTIMIZATION 上找到官方文档,但令人困惑的是网上没有任何文档。

人们只是说它减少了编译时间但没有进一步解释,或者它们与上面提到的 Swift 优化级别冲突。

据我了解,此设置设置为 YES 应该会增加编译时间,因为它启用了 WMO。因此,我认为我把 WMO 弄错了。

问题:

  1. Swift Optimization Level设置和SWIFT_WHOLE_MODULE_OPTIMIZATION有什么区别?

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

谢谢!

【问题讨论】:

  • 这个thread 可能有用。我个人不喜欢在此设置上添加自定义内容。我刚刚对compilation modeoptimization level (Xcode 10.1) 进行了更改

标签: swift optimization compilation


【解决方案1】:
  1. 主要区别在于whole-module-optimization 指的是编译器如何优化模块,而Swift Optimization Level 指的是每个文件的编译。您可以阅读有关 Swift Optimization Level here 的不同标志的更多信息。
  2. SWIFT_WHOLE_MODULE_OPTIMIZATION 提高了编译时间,因为编译器对所有函数、方法和文件之间的关系有一个更全局的视图,允许它忽略未使用的函数、优化编译顺序以及其他改进。它还专注于仅编译修改过的文件,这意味着即使激活了该标志,如果您清理项目并删除派生数据文件夹,在第一次运行期间您仍然会有更长的编译时间。

【讨论】:

  • 感谢您的回复!我不确定我是否得到它,所以请多多包涵。据我了解您的回答:通常 wmo 会减少编译时间,但是: - 当使用 Swift Optimization Level 为每个文件启用它时,它会在每次构建时编译每个文件,因此它被认为是开发的不好选择,但它可以发布。 - 当使用SWIFT_WHOLE_MODULE_OPTIMIZATION 启用它并为每个文件禁用它时,它只会编译更改的文件,因此速度更快。这是正确的吗?
  • -wmo 是一个 module 选项,这意味着当您启用它时,将为编译器提供对所有文件的全局视野并将整个项目编译为一个。这减少了时间,因为编译器知道每个文件上发生了什么变化,以及这会如何影响其他文件,并优化决策以编译它需要的所有内容。 Swift 优化级别 是一个标志,说明如何处理每个文件,与启用与否的-wmo 选项无关。 TL;DR,是的,你是对的
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 2021-12-27
  • 1970-01-01
  • 2020-06-08
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多