使用循环展开优化程序

Optimizing a program with 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 是由用户给出的,所以我不知道在这种情况下如何准确地使用循环展开。

我想知道我是否应该向这个循环添加条件,但这告诉我它会减慢我的程序。

where n is given by the user and so I don't know how to exactly make use of loop unrolling in this kind of situation

如果 n 是由用户给出的,而您不知道对其有任何限制,则您(或您的编译器)不应该进行循环展开(因为这可能是一种悲观情绪)。如果您确实知道某事,例如n 很大,可能 有益。

然而,正如@MilesBudnek 指出的那样,所有这些都是 micro-optimizations。除非在这个特定循环上每次迭代减少微秒对您的应用程序至关重要,否则您不应该接近这个也不应该手动执行任何操作。

你可以这样做:

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?)。