用户定义的SWIFT_WHOLE_MODULE_OPTIMIZATION和Swift优化级别有什么区别?

Cat*_*mon 6 optimization compilation swift

我目前正在考虑优化项目的编译时间.我一直都知道有类似于整个模块优化的东西但是在构建设置中没有检查它我没有真正深入研究它.



据我了解:

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



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

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

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


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

这个设置减少了我的DEBUG编译时间差不多一半,但它也让我感到困惑.我无法找到有关此设置及其来源的任何文档. (我对swift编译器的理解非常基础,之前我没有使用过用户定义的设置)


每个人都建议它减少编译时间而不解释原因,或者解释不会与上面提到的Swift优化级别冲突.


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




所以我的问题是:

  1. SWIFT_WHOLE_MODULE_OPTIMIZATION设置和有YES什么

区别?

  2. 为什么Swift Optimization Level减少编译时间?

谢谢!

小智 6

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