繁体   English   中英

GCC:-O3和-Os之间的差异

[英]GCC: Difference between -O3 and -Os

我对GCC -O3标志非常熟悉,但是它与-Os有何不同,在哪种情况下我们应该优先选择其他?

GCC文档描述了这些选项非常明确地做了什么。

-O3尝试极大地优化代码以提高性能。 它包括所有优化--O2包括,以及更多。

另一方面,-Os指示海湾合作委员会“优化规模”。 它支持所有不会增加可执行文件大小的 -O2优化,然后它还会切换一些优化标志以进一步减少可执行文件的大小。

请注意,我的描述有点模糊不清 - 请阅读GCC文档,以便更深入地讨论哪些标志已针对任一优化级别启用。

我相信-O *优化级别就是 - 相互排斥,独特的优化级别 混合它们并没有多大意义,因为两个级别将启用或省略另一个有意遗漏或启用的标志(分别)。 如果你想混合和匹配(你可能实际上不想这样做,除非你有一个非常好的理由想要一组特定的标志),你最好阅读文档并混合和匹配每个级别的标志手动启用。

我想我还将链接Gentoo Linux Wiki上的这篇文章该文章讨论了与构建操作系统软件包相关的优化标志。 显然并非所有这些都适用,但它仍然包含一些有趣的信息 - 一个:

使用-O3进行编译并不是提高性能的有保证的方法,实际上在很多情况下,由于更大的二进制文件和更大的内存使用量,可能会降低系统速度。 -O3也可以打破几个包。 因此,不建议使用-O3。

根据该文章,-O2在大多数情况下“与-O3一样好”,并且对于破碎的可执行输出更安全。

我建议阅读GCC文档。 -O3用于获取快速运行的代码(即使以某些代码膨胀为代价),而-Os则针对生成的代码的大小进行优化。

有大量其他(模糊的)GCC 优化标志 (例如-fgcse-sm ),其中许多甚至在-O3都没有启用。

在编译时和链接时,除了-O3-Os之外,您可能也会对-flto (用于链接时优化 )感兴趣。 然后也看到这个答案

最后,请注意使用最新版本的GCC(目前在2013年底为4.8),因为GCC正在显着改进其优化。

您可能还想使用-mtune = native (至少对于x86)。

您甚至可以编写自己的优化传递,特定于您自己的特定库和API,可能使用MELT插件。

正如CmdrMoozy回答你可能更喜欢使用-O2不是-O3 (但请注意,最近的GCC版本已经改进了很多-O3 ,因此Gentoo引用 - 对-O3和对-O2支持变得不那么相关了。)。

此外,正如这篇SlashDot-ed Stack论文 (Xi Wang,Nickolai Zeldovich,M。Frans Kaashoek和Armando Solar-Lezama)所示,许多程序并不完全符合C标准,并且当一些有效时不满意(并且表现不正确)优化已完成。 未定义的行为是一个棘手的主题。

顺便说一句,注意使用-O3通常会使你的编译时间变得更大,并且经常(但并非总是)带来比-O2甚至-O1更多的性能。(用-flto更糟糕) 。 这就是很少使用它的原因。

这取决于。 您需要优化速度或尺寸吗?

-O3
优化更多。 -O3打开-O2指定的所有优化,并打开-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload,-ftree-loop-vectorize,-ftree-slp-vectorize ,-fvect-cost-model,-ftree-partial-pre和-fipa-cp-clone选项。

-O0
减少编译时间并使调试产生预期的结果。 这是默认值。

-os
优化尺寸。 -Os启用所有通常不会增加代码大小的-O2优化。 它还执行旨在减少代码大小的进一步优化。
-Os禁用以下优化标志:

-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

实际上, -O是一长串独立优化的简写。 如果你不知道你需要什么,那就去-O3吧

-O3优化速度,而-Os优化空间。 这意味着-O3将为您提供快速可执行文件,但它可能相当大,并且-Os为您提供较小的可执行文件,但它可能会更慢。

空间和时间效率通常是一种权衡。 更快的算法倾向于占用更多空间,其中就地算法(不增加空间使用的算法)往往效率较低。

通常现代计算机具有足够的存储空间,因此通常优选-O3。 但是,如果您正在为低内存(如小型设备)编程,您可能更喜欢-Os

这真的不可能回答,一个简单的规则是在关键代码路径上使用优化速度,并在非关键代码路径上优化大小,例如加载,......

有些编译器可以在两个传递中为你决定它,第一个编译器创建一个具有分析支持的特殊可执行文件,运行应用程序来收集数据,第二个编译能够根据最佳数据来决定。 它允许去虚拟化,分支预测,......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM