循环展开是一种循环转换技术,可帮助优化程序的执行时间。我们基本上删除或减少了迭代。通过消除循环控制指令和循环测试指令,循环展开可提高程序速度。
程序1:
// This program does not uses loop unrolling.
#include
int main(void)
{
for (int i=0; i<5; i++)
printf("Hello\n"); //print hello 5 times
return 0;
}
程式2:
// This program uses loop unrolling.
#include
int main(void)
{
// unrolled the for loop in program 1
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
return 0;
}
输出:
Hello
Hello
Hello
Hello
Hello
插图:
程序2比程序1更有效,因为在程序1中,每次循环时都需要检查i的值并递增i的值。因此,可以完全展开像这样的小循环或涉及固定迭代次数的循环,以减少循环开销。
好处:
- 提高程序效率。
- 减少循环开销。
- 如果循环中的语句彼此不依赖,则可以并行执行它们。
缺点:
- 程序代码大小增加,这可能是不希望的。
- 在单次迭代中可能增加使用寄存器来存储临时变量,这可能会降低性能。
- 除了非常小的和简单的代码,包含分支的展开循环比递归还要慢。
参考:
https://zh.wikipedia.org/wiki/循环播放