-O3(优化级别3)有什么问题?

时间:2016-03-07 10:02:57

标签: c++ c gcc compiler-optimization

我注意到在 QT Creator 中,发布版本的默认优化级别为-O2。我想知道:为什么不-O3?我在这里读到 Stack Overflow 它可能是危险的或“bug暴露”,但那些被认为风险大于有用的优化标志是什么?为什么?

优化级别3标记(在 GCC 上):

  • -fgcse-after-reload
  • -finline-functions
  • -fipa-cp-clone
  • -fpredictive-commoning
  • -ftree-vectorize
  • -funswitch-loops

2 个答案:

答案 0 :(得分:4)

除了编译器错误,这可能是一个神话。它是-Ofast风险的选项,因为它甚至不能保证符合标准的程序不会中断。

正如一个实际的例子,这里是Android开放源项目(AOSP)内的快速搜索库,没有特别的顺序 - 这可能已经足够了真正的生产代码库" - 使用-O3

  

cblas,openssh,libmpeg2,libavc,lvvm:MCJIT,jpeg,zlib,lz4,regex-re2,libpng,libutf,(及更多)

AOSP中的其他代码只是尝试优化大小(仍然是Android),因此明确使用-Os。但是大部分代码仍然使用所有这些库 - 性能比尺寸更重要。另请注意,正确性可能是一个大问题,特别是对于openssh之类的问题,这是上面偶然提到的。

请记住,程序员总是倾向于对优化代码更加怀疑。如果您没有开始编写符合标准的代码,并深入研究未定义的& amp;未指明的行为,理论上没有什么可以阻止编译器在不同的配置(例如优化级别)之间生成不同的结果。

因此,当您主要在一个特定级别(调试)上完成工作时,您倾向于将其作为基本参考点,然后,当您切换时,很容易简单地责怪优化器 - 就其本身而言,与我们自己的代码不同,它可能会做很多事情以保持符合标准。

答案 1 :(得分:2)

评论中优秀链接的摘要:-O2通常比较高优化级别更受欢迎,原因如下:

  • 较小的生成代码大小(通常因为分支预测的处理器缓存而等同于更好的性能)
  • 减少编译时间
  • 错误(在您的代码中)更容易在更高的优化级别中暴露。

优化程序错误并非闻所未闻,但大多数情况下,真正的原因是源代码中的未定义行为。另一方面,我记得一个15岁以上的(商业)编译器,它充满了优化错误,并且在一个实例中甚至成功地修复了#34;一个错误的计划。

关于优化级别之间的速度差异:SunCC的文档读取类似" -O4通常比-O3快,-O3通常比-O2快。但有时候--O2击败所有其他人。"。根据我的经验,-O2通常更快,而不仅仅是有时。