📜  循环展开

📅  最后修改于: 2021-04-29 15:18:16             🧑  作者: Mango

循环展开是一种循环转换技术,可帮助优化程序的执行时间。我们基本上删除或减少了迭代。通过消除循环控制指令和循环测试指令,循环展开可提高程序速度。

程序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/循环播放