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

Why is moving return to the end of the function less efficient?

本文关键字:效率 移动 返回 函数 为什么      更新时间:2023-10-16

编辑:删除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上使用完全优化编译。

调用函数400000000次,采样10次,foo总是更快:

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

差别很小,但确实存在。为什么?此外,为什么编译器不将它们优化为相同的东西?

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

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

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

在foo的情况下,将不会执行"if"answers"else"的大括号。返回后

语句控件将直接得到函数的右括号。

这就是为什么foo需要更少的时间。