优化代码指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。
gcc提供的代码优化功能非常强大,它通过编译选项-On(其中n是代表优化级别的整数)来控制优化代码的生成。
对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。
编译时使用选项-O可以告诉gcc同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。
选项-O2告诉gcc除了完成所有-O1级别的优化外,同时还要进行一些额外的调整工作,如处理器指令调度等。
选项-O3则除了完成所有-O2级别的优化外,还包括循环进展和其他一些与处理器特性相关的优化工作。
通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间取得了一个比较理想的平衡点。
下面通过一个例子(这个例子是专门针对gcc优化功能而设计)说明一下
#include <stdio.h>
int main()
{
double counter;
double result;
double temp;
for(counter = 0; counter < 4000.0 * 4000.0 * 4000.0 / 20.0 + 2030;
counter += (5 - 3 + 2 + 1) / 4)
{
temp = counter / 1239;
result = counter;
}
printf("Result is %lf\n",result );
return 0;
}
首先不加任何优化项进行编译:
[root@localhost 1031]# gcc -Wall count.c -o count
[root@localhost 1031]# time ./count
real 0m1.473s
user 0m1.479s
sys 0m0.010s
接下来使用优化项来对代码进行优化处理:
[root@localhost 1031]# gcc -Wall count.c -o count2
[root@localhost 1031]# time ./count2
real 0m1.357s
user 0m1.364s
sys 0m0.007s
对比两次执行的输出结果不难看出,程序的性能的确得到了改善。
尽管gcc的代码优化功能非常强大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高质量的代码。