何时为gcc使用-O2标志?

时间:2009-05-20 11:59:49

标签: c++ unix optimization gcc

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

我如何决定是否使用它?

也许O2在某些特定类型的代码中有很大的不同(例如数学计算?),我应该只将它用于项目的那些部分?

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

6 个答案:

答案 0 :(得分:23)

我建议大多数时候使用-O2,好处包括:

  • 通常会减少生成代码的大小(与-O3不同)。
  • 更多警告(某些警告需要仅在优化期间进行分析)
  • 通常可以显着提高性能(这可能无关紧要)。

如果发布级代码启用了优化,则最好在整个开发/测试周期中启用优化。

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

答案 1 :(得分:11)

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

但是,第一个因素可以通过良好的构建策略和其他技巧来减少整体构建时间。此外,由于大多数编译实际上是I / O绑定的,因此编译时间的增加通常不会 发音。

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

答案 2 :(得分:6)

从不。

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

答案 3 :(得分:5)

总是,除非您正在编程并且只想测试您刚刚编写的内容。

答案 4 :(得分:3)

我们通常会设置构建环境,以便我们可以构建使用-O0的 debug builds 和使用-O3的发布构建(构建环境保留对象)和所有配置的库,以便可以在配置之间轻松切换)。在开发过程中,一个主要构建和运行调试配置,以实现更快的构建速度(以及更准确的调试信息),并且不太经常地构建和测试发布配置。

答案 5 :(得分:2)

增加的编译时间真的很明显吗?我一直使用-O2作为默认值,不再只是在你的代码中留下了很多“摩擦”。另请注意,-O1,-O2的优化级别往往是最好的测试,因为它们最有趣。 -O0往往更加错误,你可以根据我的经验调试-O2。如果你对编译器在代码重新排序,内联等方面可以做些什么有所了解

-Werror -Wall是必要的。