热门问题
时间线
聊天
视角
循环展开
来自维基百科,自由的百科全书
Remove ads
循环展开(Loop unwinding或loop unrolling),是一种牺牲程序的大小来加快程序执行速度的优化方法。可以由程序员完成,也可由编译器自动优化完成。
例子
for (i = 1; i <= 60; i++)
a[i] = a[i] * b + c;
可以如此循环展开:
for (i = 1; i <= 58; i+=3)
{
a[i] = a[i] * b + c;
a[i+1] = a[i+1] * b + c;
a[i+2] = a[i+2] * b + c;
}
这被称为展开了两次。
优点
- 分支预测失败减少。
- 如果循环结构内语句没有数据相关,增加了并发执行的机会。
- 可以在执行时动态循环展开。这种情况在编译时也不可能掌握。
缺点
- 代码膨胀
- 代码可读性降低,除非是编译器透明执行循环展开。
- 循环结构内包含递归可能会降低循环展开的效益。[1]
扩展阅读
Kennedy, Ken; Allen, Randy. Optimizing Compilers for Modern Architectures: A Dependence-based Approach. Morgan Kaufmann. 2001. ISBN 1-55860-286-0.
参考文献
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads