通过循环展开优化程序

时间:2019-05-20 20:00:02

标签: c++ for-loop loop-unrolling

我有一个问题,关于循环在for循环中展开以及如何在for循环中使用,因为您直到用户输入才知道迭代次数。

我已经看到了在循环中展开循环的示例,其中给出了迭代次数,并且在一次迭代中执行了更多指令。例如:

for(int i=0; i < 50; i++){ // instead of i < 200
 doSomething();
 doSomething();
 doSomething();
 doSomething();
}

我的问题仅针对

for(i=0; i<n; i++){
  doSomething();
}

n是由用户给出的,因此我不知道如何在这种情况下完全利用循环展开。

我想知道是否应该在此循环中添加条件,但这告诉我这会减慢我的程序的速度。

2 个答案:

答案 0 :(得分:2)

  

其中n是用户指定的,因此我不知道如何在这种情况下准确利用循环展开

如果n是由用户给出的,并且您不知道对它的任何约束,那么您(您的编译器)也不应进行循环展开(因为这可能是一个悲观的说法)。如果您确实知道一些知识,例如n很大,可能 是有益的。

但是,正如@MilesBudnek指出的那样,所有这些都是微优化。除非在此特定循环上每次迭代减少微秒数对您的应用程序至关重要,否则您不应采用这种方法,也不应手动执行任何操作。

答案 1 :(得分:2)

您可以这样做:

int i = 0;
while (i<=n-4) {
    doSomething();
    doSomething();
    doSomething();
    doSomething();
    i += 4;
}
while (i<n) {
    doSomething();
    i++;
}

您可能要用3个if替换第二个循环(因为循环主体最多执行3次)。

请注意,优化编译器通常会自动执行这种转换,因此您不必这样做(除非它们没有:Why is an integer array search loop slower in C++ than Java?)。