如果在循环的条件部分中进行大量计算,运行时是否存在差异?
例如:
int i,n;
for(i=1;i<=[call to some complex function on n];i++)
...
或者
int i,n,foo;
foo=[call to some complex function on n];
for(i=1;i<=foo;i++)
...
哪一个效率更高?循环是进行一次计算还是每次迭代?
答案 0 :(得分:6)
是的,会有一个&#34;性能上升&#34;对于for
循环的条件部分中提供的函数,除非函数是const,并且编译器可以将其减少到常量值。编译器需要为每次迭代调用函数。
我强烈建议在进入循环之前将函数的结果放入一个常量临时变量中。
示例:
const unsigned int limit = my_vector.size();
for (unsigned int i = 0; i < limit; ++i)
{
// iterate over vector
}
答案 1 :(得分:1)
最好衡量:这是公分母的建议: - )
但是,从代码生成的角度来看逻辑推理:
如果关系表达式的第二个操作数可由编译器识别为循环不变表达式,则它可以安全地执行代码运动。您将获得所有好处,就好像您手动完成它一样。
Loop-Invariant代码识别受到一些限制,包括但不限于:
点#1和#3不适用,如果您能够手动将其移出 - 意味着没有数据依赖性。
关于性能差异,它取决于成本。我遇到了代码审查,由于循环中的条件表达式,有人无意中制作了算法O(n ^ 2)。
很高兴你关注它。