C++ 何时对gcc使用-O2标志?

C++ 何时对gcc使用-O2标志?,c++,unix,optimization,gcc,C++,Unix,Optimization,Gcc,如果使用“-O2”标志,性能会提高,但编译时间会变长 我如何决定是否使用它 也许O2在某些特定类型的代码(例如数学计算?)中发挥了最大的作用,我应该只在项目的那些部分使用它 编辑:我想强调一个事实,即为我的项目的所有组件设置-O2会将总编译时间从10分钟更改为30分钟。总是这样,除非你正在编程,只是想测试你刚写的东西。我从事生物信息学,所以我的建议可能有偏见。也就是说,我总是使用-O3开关(用于发布和测试构建,也就是说;通常不用于调试)。诚然,它有一些缺点,即增加编译时间和可执行文件的大小 然而

如果使用“-O2”标志,性能会提高,但编译时间会变长

我如何决定是否使用它

也许O2在某些特定类型的代码(例如数学计算?)中发挥了最大的作用,我应该只在项目的那些部分使用它


编辑:我想强调一个事实,即为我的项目的所有组件设置-O2会将总编译时间从10分钟更改为30分钟。

总是这样,除非你正在编程,只是想测试你刚写的东西。

我从事生物信息学,所以我的建议可能有偏见。也就是说,我总是使用
-O3
开关(用于发布和测试构建,也就是说;通常不用于调试)。诚然,它有一些缺点,即增加编译时间和可执行文件的大小

然而,第一个因素可以通过良好的构建策略和减少总体构建时间的其他技巧来部分缓解。此外,由于大多数编译实际上都是I/O绑定的,因此编译时间的增加通常并不明显

第二个缺点是可执行文件的大小,通常根本不重要。

永远不会


使用-O3-Wall-Werror-std=[无论您的代码库应该遵循什么]

我建议在大多数情况下使用-O2,好处包括:

  • 通常减少生成代码的大小(不像-O3)
  • 更多警告(某些警告需要仅在优化过程中进行的分析)
  • 通常可测量地改善性能(这可能无关紧要)
如果发布级代码将启用优化,那么最好在整个开发/测试周期中启用优化


启用优化后,源代码级调试更加困难,有时在调试问题时禁用优化会有所帮助。

我们通常会设置生成环境,以便生成使用-O0的调试生成和使用-O3的发布生成(构建环境保留了所有配置的对象和库,因此可以轻松地在配置之间切换)。在开发过程中,主要构建和运行调试配置,以加快构建速度(以及更准确的调试信息)而且构建和测试发布配置的频率也较低。

编译时间的增加真的值得注意吗?我一直使用-O2作为默认值,任何更少的都会留下很多“摩擦”在您的代码中。还请注意,-O1,-O2的优化级别往往是经过最好测试的,因为它们最有趣,-O0往往更容易出现错误,根据我的经验,您可以在-O2处进行很好的调试。前提是您对编译器在代码重新排序、内联等方面的功能有一些了解


-Werror-Wall是必要的。

如果您需要减少代码大小,为什么不使用-Os而不是-O2?如果代码大小是最重要的优化目标,那么使用-Os是有意义的-通常不是(小型嵌入式系统除外…)我不止一次看到编译器在被告知优化大小时生成的二进制文件比被告知优化速度时生成的二进制文件大。我总是使用-O2,有时使用-O3,但要承担相应的风险。确切地说,正确构造构建并注意生成文件中的依赖关系通常会使编译时间成为一个问题。同样的情况下ally有助于提高可执行文件的大小,尽管我见过有人做了一些非常愚蠢的事情,结果导致了巨大的程序。我喜欢这个答案,但我要补充一点,那就是它应该很容易运行,而无需优化,因为GDB的工作方式要好得多。根据我的经验,与链接时间相比,编译时间“很容易”修复。(搜索时间到了!)“缩短链接时间”问题!)在编译时,IO时间是不一致的。我发现,非常大的C++文件的-O3构建占用了大量的CPU时间。因为GCC 4.4和以前没有LTO,所以我把大量的C++文件连接起来。因为你们手动连接C++文件,所以你们的特殊情况是,这可能会降低IO开销TE。这是错误的,因为它可以防止重复读取包含文件。在最好的情况下,这可能会有指数级的加速。好吧,不知何故,为我的项目的所有组件设置-O2会将总编译时间从10分钟更改为30分钟10分钟更改为30分钟。这足以让你避免它。这并不能回答你的问题r问题,但基于yoru edit,听起来您需要更改构建项目的方式。在初始构建之后,应该只将修改后的源代码编译到.o,然后将.o文件链接在一起。预编译的头文件也可以帮助构建性能。作为一个实验,我使用-O3和-Os构建了LAME,除了使用-O3用于评测后手工挑选的一些文件。大多数操作系统版本实际上快了10%左右。优化开关不是一个神奇的性能刻度盘,但如果将其设置为11,则会使可执行文件变大,调试更加困难,并引入与优化相关的错误。