GCC具有优化代码的功能,代码的优化是一项比较复杂的工作,它可归为:源代码级优化、速度与空间的权衡、执行代码的调度。但一般调试的时候推荐不使用优化,而是在你的程序的功能模块完成后,因为代码经过优化后,原先在源码程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所以这些都将使调试工作异常艰难。所以如果将要将众多模块整合成一个完整的软件的时候,可以考虑优化一下你的GCC,使得你的软件运行更快。

GCC提供了下列优化选项:
-O0 : 默认不优化(若要生成调试信息,最好不优化)
-O1 : 简单优化,不进行速度与空间的权衡优化;
-O2 : 进一步的优化,包括了调度。(若要优化,该选项最适合,它是GNU发布软件的默认优化级别;
-O3 : 最高优化;
-funroll-loops : 展开循环,会使可执行文件增大,而速度是否增加取决于特定环境;
-Os : 生成最小执行文件;
一般来说,调试时不优化,一般的优化选项用-O2(gcc允许-g与-O2联用,这也是GNU软件包发布的默认选项),embedded可以考虑-Os。

下面来看看example:

int main()

{

    int count;

    int start;

    int end;

    for(count = 0 ;count < (1000000000 + 7530)/18;count = count +7)

    {

         start = (count + 7530)/18;      /*test code: you can add difficulty operation  */

          end = count; 

     }

    printf("%7d%7d",start,end);

    return 0;

}

gcc -o test   test.c

看你的程序运行时间

$  time ./test

然后你看看使用下列方法:

gcc -o test test.c -lm -o1

在去看看你的程序运行时间

$ time ./test
再用-o2,o3,相互试试。。。

出来的时间可以明显的比对相互的差异,当然了,这些值随着机器的配置不一样,运行结果也不一样。


time测量指定程序的执行时间,结果由三部分组成:
real : 进程总的执行时间, 它和系统负载有关(包括了进程调度,切换的时间)
user: 被测量进程中用户指令的执行时间
sys : 被测量进程中内核代用户指令执行的时间

user和sys的和被称为CPU时间.