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。如果不这样干,想想你会怎么写呢?高手的话无所谓吧,如果是一般水平的话,那就是信手拈来的,先整上一个判断是奇数还是偶数再说,水平感觉就不一样了啊。
本人学生,听别人说写博客对提升自己很有帮助,终于下手写文章了,第一次写博客文章,感觉又是一个进步啊,哈哈!好了,继续读书!
- GCC提高程序运行效率:循环展开(loop unrolling)——An Introduction to GCC
- An Introduction to GCC
- An Introduction to GCC
- An Introduction to GCC
- 循环展开(loop unrolling / loop unwinding)
- introduction to gcc
- Introduction to Gcc four stages
- Loop Unrolling
- Loop unrolling
- C#并行运行迭代(循环),提高运行效率
- 提高程序的运行效率
- 安装mingw+msys问题之二——GCC is unable to create an exe
- loop unrolling in C++
- gcc宏展开
- 用GCC 展开 源文件
- 循环体内调试程序 ---(提高调试效率)
- gcc提高程序性能的几个参数
- 提高jsp程序的运行效率
- excel转换为sql命令
- 匿名方法[1]
- 黑马程序员---JAVA概述总结
- CSS
- 右侧带透明遮罩效果文字简要的jQuery焦点图代码
- GCC提高程序运行效率:循环展开(loop unrolling)——An Introduction to GCC
- Go 获取指定目录下的文件
- hibernate映射oracle数据库时出现“不许序列化”
- Java方法调用的绑定
- 杨毅:不够优秀就不要腆着脸继续占便宜
- 出差记
- Top 10 Websites for Advanced Level Java Developers
- 判断一个数是否是素数
- yum搭建lnmp环境(CentOS6.4)