好记性不如铅笔头

编程

Gcc优化选项

参考链接
《 https://blog.csdn.net/zhang626zhen/article/details/52988242

gcc默认提供了5级优化选项的集合:

-O0:无优化(默认)。
-O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。
在编译大型程序的时候会显著增加编译时内存的使用和时间。
-O2: 此选项将增加编译时间和目标文件的执行性能。
包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。
编译器不执行循环展开以及函数内联。
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项,并且执行专门减小目标文件大小的优化选项。
-O3:打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload and -ftree-vectorize优化选项。

-O和-O1:
o1是最基本的优化,主要对代码的分支,表达式,常量来进行优化,编译器会在较短的时间下将代码变得更加短小,这样体积就会变得更小,会减少内存的占用率,在操作系统进行内存调度时就会更快。但是事情没有绝对的优点,当一个庞大的程序被拆碎细分的话,内存占用会大大增加,由于当今系统大多数都是多线程,就会出现卡顿和反应延迟。

-O2:
进一步的优化。GCC会支持所有不涉及时间空间交换的所有支持的优化选项。当加入-o2选项时,编译器不会进行循环展开和函数内联。与-O选项相比,这个选项会增加编辑时间和合成码的性能。

-O3:
再一次的优化,-O3选项会添加所有-O2中添加的选项,并且添加`-finline-functions’,`-funswitch-loops’ and `-fgcse-after-reload’ 这三个选项。
这个优化属于非常强大的优化,因为编译器会进行预测,对循环每一层的预测,以便于将循环拆分,可以提高执行效率。编译器还会试图用已有的值来代替未知的值,并且还会用加代替乘,因为运算器的特性,乘法十分复杂耗时。当然o3的缺点最明显,那就是o3因为试图预测程序的走向,可能会出现误差,导致错误和程序不可逆转的走向。所以一般o3不建议使用。
这是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的。
-Os:
原来-Os相当于-O2.5。是使用了所有-O2的优化选项,但又不增加代码尺寸的方法。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的。

详细的说明如下:
Level 2.5 (-Os)
The special optimization level (-Os orsize) enables all -O2 optimizations that do not increase code size; it puts theemphasis on size over speed. This includes all second-level optimizations,except for the alignment optimizations. The alignment optimizations skip spaceto align functions, loops, jumps and labels to an address that is a multiple ofa power of two, in an architecture-dependent manner. Skipping to theseboundaries can increase performance as well as the size of the resulting codeand data spaces; therefore, these particular optimizations are disabled.
 

发表评论

1 × 1 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据