使用循环展开优化程序
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?)。
我有一个关于 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?)。