编辑:在移除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 平均值差异很小,但它就在那里。为什么?另外,为什么编译器不能将它们优化为同一个东西?
答案 0 :(得分:3)
看看汇编程序输出,可能会跳转到goo()的第一个分支中函数的末尾。
答案 1 :(得分:0)
我假设这是因为在每个if
中都有返回,操作完成的那一刻,foo
将返回计算的变量。
goo
,即使它认为它做同样的事情,除了两个返回,仍然必须检查else
语句。这使用一些时间(非常小),但正如你所看到的,这是可以理解的。
答案 2 :(得分:-3)
如果"如果"和"否则"不会被执行。返回后
语句控件将直接得到函数的结束。
这就是为什么foo会花费更少的时间。