GCC提高程序运行效率:循环展开(loop unrolling)——An Introduction to GCC

来源:互联网 发布:网络上的pj是什么意思 编辑:程序博客网 时间:2024/06/08 00:37

GCC会自动为程序做一些优化处理,以提高程序的运行效率,如消除相同运算子句(一个计算式里出现多次“x+y”,则会先生动生成一个局部变量保存"x+y"的值,再做计算)、inlining、loop unrolling等。下面就loop unrolling作以总结。

举个例子:

for ( i = 0; i < 9; ++i ){x[i] = i;}

在上述代码中,每为执行一次循环都要做一个i<9的判断,这当然会占用一部分执行时间。但如果把代码展开:

x[0] = 0;x[1] = 1;x[2] = 2;...x[8] = 8;
则不需要i<9的判断,效率也自然提高。

这就是loop unrolling,一种以空间换效率的优化处理方式,在其间进行取舍的过程被称为speed-space tradeoffs。

以上是当循环判断条件为定值的情况,那如果程序如下,应该怎么优化呢?

for ( i = 0; i < n; ++i ){x[i] = i;}

n是一个运行时确定的数,这样是无法对代码完全展开的,伤脑筋啊!

其实有一定经验的程序员或者科研人员应该都可以想出一种优化办法,就是——折衷,也可以说是两种或两种以上方式结合的办法,这个方法可是万金油啊。

可以通过loop和loop unrolling结合,做一个部分展开,实现优化,下面是书上的原例子,效率是最初代码的2倍。

first step:

for ( i = 0; i < ( n % 2 ); ++i ){x[i] = i;}

second step:

for ( ; i + 1 < n; i += 2 ){x[i] = i;x[i+1] = i+1;}

为何分两步呢?这只能说编译器——“你太有才了!”first step保证 i == (n % 2) ,然后再 i 每次递增2的时候,就可以保证一定能有i == n 的出现,相应地判断条件可以写成 i != n,或者i + 1 < n。如果不这样干,想想你会怎么写呢?高手的话无所谓吧,如果是一般水平的话,那就是信手拈来的,先整上一个判断是奇数还是偶数再说,水平感觉就不一样了啊。

本人学生,听别人说写博客对提升自己很有帮助,终于下手写文章了,第一次写博客文章,感觉又是一个进步啊,哈哈!好了,继续读书!


原创粉丝点击