源代码如下:
#include
int main( )
{
int i,j;
long sum=0L;
for( i=0;i<100000;i++ )
for( j=0;j<1000;j++ )
sum+=i*j;
printf( "%ld/n",sum );
return 0;
}
编译的命令为:
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -O3 foo.c -o foo_O3
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -O2 foo.c -o foo_O2
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -O1 foo.c -o foo_O1
winlin@winlin-Satellite:~/Mypro$ gcc -Wall foo.c -o foo
首先使用size进行比较:
由分析可知在进行 -O2和-O3选项优化时,都比较明显的减小了text段的大小,-O选项优化时text段反而增加了一点;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然后使用time来进行比较:
由上面的图可知进行优化的时候,选择优化的等级越高,运行时间总是趋于越短;
#########################################################
下面我们来看一下进行优化了以后,对调试会有什么影响:
运行一下命令:
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -c foo.c -o foo.o
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -c -O1 foo.c -o foo_O1.o
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -c -O2 foo.c -o foo_O2.o
winlin@winlin-Satellite:~/Mypro$ gcc -Wall -c -O3 foo.c -o foo_O3.o
然后我们运行:
objdump -d foo.o
objdump -d foo_O1.o
objdump -d foo_O2.o
objdump -d foo_O3.o
另外如果我们使用“objdump -d foo”或者“objdump -d foo_Ox”的话,我们得到的结果和我们运行“objdump -d foo*.o”得到的结果几乎一样,
我们看到我们使用优化选项以后,相应的反汇编代码就会变得简短,所以对于优化过的应用程序,会增加我们反汇编的难度。
所以,很多书上推荐,只有当你发布releaes版本的时候,才进行优化,以便于我们调试和修改。