【发布时间】:2012-11-04 09:30:06
【问题描述】:
我有这个 C 函数:
double f(int x)
{
if (x <= 0)
return 0.0;
else
return x * log(x);
}
我在一个紧密的循环中调用它,并且想摆脱分支以查看它是否可以提高性能。
我不能用这个:
double f(int x)
{
return x * log(x);
}
因为它在 x == 0 时返回 NaN(大约 25% 的时间是这样)
有没有其他方法来实现它,使它在x == 0时返回0,但仍然摆脱分支?
(我不太关心负输入,因为这些是错误,而零则不是。)
【问题讨论】:
-
?:也是分支,但如果你想摆脱if-else,那么你可以使用它 -
嗯,你确实有一个分段函数。很难想象如何在没有条件的情况下评估它。但是请检查您的程序集,它可能会通过条件移动替换分支。
-
此计算的性能将完全由
log主导。因此,您想要那里的分支,因为如果您要丢弃答案,您不想调用log。 -
对数在 x86-64 上实现为函数。不分支但调用昂贵的函数不太可能总是带来比分支更多的东西并且偶尔不调用它。
-
为了测试性能,只需将函数替换为
return x * log(x)即可。当然,这给出了错误的答案,但它并不比您可能想出的任何无分支代码慢。因此,除非它比您拥有的速度快得多,否则您可以停止。没有必要真正想出无分支代码,因为您已经确定它无济于事。
标签: c optimization nan logarithm branch-prediction