我有一个小程序,当用-O1
编译时,它的性能要好得多,而不是没有优化。我很想知道编译器做了什么优化导致了这种加速。
我想我会做的是获取-O1
等效的优化标志列表(从手册页和gcc -Q -v
中获得),然后选择列表来查看性能如何变化。
我所发现的是,即使包括整个优化列表仍然没有给予我一个程序,以及执行一个-o 1优化的一个。
换句话说
gcc -O0 -fcprop-registers -fdefer-pop -fforward-propagate -fguess-branch-probability \
-fif-conversion -fif-conversion2 -finline -fipa-pure-const -fipa-reference \
-fmerge-constants -fsplit-wide-types -ftoplevel-reorder -ftree-ccp -ftree-ch \
-ftree-copy-prop -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse \
-ftree-fre -ftree-sink -ftree-sra -ftree-ter myprogram.c
并不等同于
gcc -O1 myprogram.c
我用的是gcc 4.5.3版-O1
还有什么没有包含在手册中与-O1
相关的优化标志列表中的吗?
2条答案
按热度按时间ax6ht2ek1#
如何使用-S选项来检查生成的汇编程序?
从使用“my_program.c”的两个实验来看,-O 0选项似乎禁用了所有优化,而不管建议算法的长列表。
jv4diomz2#
这是预期的,而不是一个bug:https://gcc.gnu.org/wiki/FAQ#optimization-options
是的,它开启了优化。单个
-fxxx
标志不会这样做。如果您不使用
-O1
、-O2
、-O3
、-Ofast
或-Og
优化选项之一(而不是-O0
),则根本不会发生优化,因此调整 * 哪些 * 优化通道处于活动状态不会起任何作用。若要查找哪一个优化过程产生了差异,您可以打开
-O1
,然后禁用各个优化过程,直到找到产生差异的优化过程。即,而不是:
用途: