为什么移动返回函数的末尾效率较低?

时间:2012-07-09 13:17:57

标签: c++ performance optimization

编辑:在移除UB(好位置,我错过了)之后,时间或多或少相同。将标记主持人将其删除。

这两个函数是相同的,除了foo在两个分支上if内都有返回的事实,而goo在最后有一个return

int foo()
{
    static int x = 0;
    if ( x )
    {
        x > 2 ? x = 0 : ++x;
        return x-1;
    }
    else
    {
        x++;
        return x-1;
    }
}
int goo()
{
    static int x = 0;
    if ( x )
    {
        x > 2 ? x = 0 : ++x;
    }
    else
    {
        x++;
    }
    return x-1;
}

数字就在那里,所以优化不会太难,而且函数调用没有被优化掉。在MSVS 2010上使用完全优化进行编译。

调用函数4000000000次,抽样10次,foo 总是更快:

  • foo - 8830 ms 平均值
  • goo - 8703 ms 平均值

差异很小,但它就在那里。为什么?另外,为什么编译器不能将它们优化为同一个东西?

3 个答案:

答案 0 :(得分:3)

看看汇编程序输出,可能会跳转到goo()的第一个分支中函数的末尾。

答案 1 :(得分:0)

我假设这是因为在每个if中都有返回,操作完成的那一刻,foo将返回计算的变量。

goo,即使它认为它做同样的事情,除了两个返回,仍然必须检查else语句。这使用一些时间(非常小),但正如你所看到的,这是可以理解的。

答案 2 :(得分:-3)

如果"如果"和"否则"不会被执行。返回后

语句控件将直接得到函数的结束。

这就是为什么foo会花费更少的时间。