草庐IT

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

coder 2023-09-04 原文

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

虽然我知道有一个叫做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] 因为最佳编译时间并不重要偶尔发布版本。

但是,在寻找有关如何减少调试 配置的编译时间的提示时,我发现了这个用户定义 设置:

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

此设置将我的调试编译时间几乎减半

因为我是 Swift 编译器和用户定义设置的新手,所以我试图找到关于 SWIFT_WHOLE_MODULE_OPTIMIZATION 的官方文档,但令人困惑的是那里没有任何在线文档。

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

据我了解,此设置设置为 YES 会增加编译时间,因为它启用了 WMO。因此,我认为我错误地理解了 WMO

问题:

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

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

谢谢!

最佳答案

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

关于swift - 用户定义的 SWIFT_WHOLE_MODULE_OPTIMIZATION 和 Swift 优化级别之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705932/

有关swift - 用户定义的 SWIFT_WHOLE_MODULE_OPTIMIZATION 和 Swift 优化级别之间有什么区别?的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - 为什么人们使用 `Module.send(:prepend, …)` ? - 2

    我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从

随机推荐