5

编辑:删除 UB 后(好地方,我错过了),时间或多或少相同。将标记版主删除它。

这两个函数是相同的,除了在两个分支的 ,foo内都有返回,而在末尾有一个:ifgooreturn

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 毫秒
  • goo-平均8703 毫秒

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

4

3 回答 3

3

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

于 2012-07-09T13:21:29.350 回答
0

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

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

于 2012-07-09T13:21:42.880 回答
-3

如果 foo 结束括号“if”和“else”将不会被执行。归来后

声明控件将直接得到函数的末尾大括号。

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

于 2012-07-09T13:29:55.923 回答