如果繁重的计算函数在循环的条件部分中,运行时是否存在差异?

时间:2014-12-05 19:30:49

标签: c++ performance runtime

如果在循环的条件部分中进行大量计算,运行时是否存在差异?

例如:

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++)
...

哪一个效率更高?循环是进行一次计算还是每次迭代?

2 个答案:

答案 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. 循环索引本身未参与表达式。
  2. 通常,任何指针都会抛弃编译器,因为它无法推理。
  3. 如果表达式涉及一个变量,它在循环体内是&#34; def,那就不行了。
  4. 点#1和#3不适用,如果您能够手动将其移出 - 意味着没有数据依赖性。

    关于性能差异,它取决于成本。我遇到了代码审查,由于循环中的条件表达式,有人无意中制作了算法O(n ^ 2)。

    很高兴你关注它。