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时间.