我很熟悉GCC的-O3旗帜,但是它和-Os有什么不同呢?在哪种情况下我们应该选择一个而另一个呢?
发布于 2013-10-30 16:53:50
GCC文献非常明确地描述了这些选项的作用。
为了提高性能,-O3非常努力地优化代码。它包括了-O2所包含的所有优化,以及更多的优化。
另一方面,-Os则指示GCC“优化尺寸”。它支持所有不增加可执行文件大小的-O2优化,然后它还切换一些优化标志以进一步减小可执行文件的大小。
请注意,我一直故意对我的描述有点模糊-阅读GCC的文档,以获得更深入的讨论,确切地说,哪些标志是启用的两个优化级别。
我相信-O*优化级别只是相互排斥的,不同的优化级别。混合它们是没有意义的,因为两个级别将启用或忽略另一个有意忽略或启用(分别)的标志。如果您想要混合和匹配(您可能实际上不想这样做,除非您确实有一个很好的理由想要一组特定的标志),最好是阅读文档,并混合和匹配每个级别手动启用的标志。
我想我还会链接Gentoo Linux的这篇文章,它讨论优化标志,因为它们与为操作系统构建包有关。显然,并不是所有这些都适用,但它仍然包含一些有趣的信息--例如:
用-O3编译并不能保证提高性能,事实上,在许多情况下,由于二进制文件更大和内存使用量增加,系统的运行速度会减慢。众所周知,-O3还破坏了几个包。因此,不建议使用-O3。
根据那篇文章,-O2在大多数情况下“和-O3一样好”,对于坏掉的可执行输出,使用起来更安全。
发布于 2013-10-30 16:54:47
我建议阅读GCC的文件。-O3用于获得快速运行的代码(甚至牺牲了一些代码膨胀),而-Os正在优化生成代码的大小。
还有很多其他(晦涩的) GCC 优化标志 (例如-fgcse-sm),其中许多甚至在-O3也没有启用。
您可能还会对-flto (用于链接时优化)感兴趣,除了在编译时和链接时使用-O3或-Os之外。那就看看这个答案吧。
最后,请注意使用最新版本的GCC (目前在2013年底为4.8 ),因为GCC正在极大地改进其优化。
您可能还想使用-mtune=native (至少对于x86)。
您甚至可以编写自己的优化传递,特定于您自己的特定库和API,也许可以使用熔化插件。
正如CmdrMoozy回答一样,您可能更喜欢使用-O2而不是-O3 (但是请注意,最近的GCC版本已经大大改进了它们的-O3,因此Gentoo引文-recommending反对-O3并支持-O2变得不那么重要了。)
同样,正如这个SlashDot 叠纸 (由Xi Wang、Nickolai Zeldovich、M. Frans Kaashoek和Armando Solar)显示的那样,许多程序并不完全符合C标准,并且在进行一些有效的优化时不高兴(而且行为不正确)。未定义行为是一个棘手的课题。
顺便说一句,请注意,使用-O3通常会使您的编译时间更长,并且通常(但并不总是)比-O2甚至-O1高出几%的性能.(-flto的情况更糟)。这就是我很少使用它的原因。
发布于 2013-10-30 16:53:05
那得看情况。你需要优化速度还是尺寸?
-O3 优化更多。-O3打开了由-O2指定的所有优化,还打开了-finline-函数、-funswitch-循环、-f预测-共同、-fgcse-reload、-ftree-循环-矢量化、-ftree-slp-矢量化、-fvect-成本-模型、-ftree-pre cp-克隆选项。 -O0 减少编译时间,使调试产生预期的结果。这是默认的。 -Os 尺寸优化。-Os支持所有通常不会增加代码大小的-O2优化。它还执行旨在减少代码大小的进一步优化。 -Os禁用以下优化标志:
-falign-functions-falign-jumps-falign-loops-falign-labels-freorder-blocks-freorder-blocks-and-partition-fprefetch-loop-arrayshttp://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
实际上,-O是一长串独立优化的缩写。如果您不知道您需要什么,请选择-O3。
https://stackoverflow.com/questions/19689014
复制相似问题