我正在分析我的代码并优化我能做的一切,归结为一个看起来像这样的函数:
double func(double a, double b, double c, double d, int i){
if(i > 10 && a > b || i < 11 && a < b)
return abs(a-b)/c;
else
return d/c;
}
它在程序运行期间被调用了数百万次,探查器显示约 80% 的时间都花在了调用 abs()
上。
我用
fabs()
替换了abs()
并且它提供了大约 10% 的速度,这对我来说没有多大意义,因为我听到了很多多次它们对于 float 是相同的,并且应该始终使用abs()
。这是不真实的还是我遗漏了什么?评估 double 的绝对值可以进一步提高性能的最快方法是什么?
如果重要的话,我在 linux X86_64 上使用 g++
。
最佳答案
进行所有 3 项计算。将结果粘贴到 3 元素数组中。使用非分支算法找到正确的数组索引。返回该结果。
即,
bool icheck = i > 10;
bool zero = icheck & (a > b);
bool one = !icheck & (b > a);
bool two = !zero & !one;
int idx = one | (two << 1);
return val[idx];
其中 val
保存三个计算的结果。使用 &
而不是 &&
很重要。
这消除了您的分支预测问题。最后,确保循环代码可以看到实现,这样可以消除调用开销。
关于c++ - 在 C++ 中加速双绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704532/