sas*_*llo 3 c++ performance profiling absolute-value c++11
我正在分析我的代码并优化我所能做的一切,直到一个看起来像这样的函数:
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;
}
Run Code Online (Sandbox Code Playgroud)
在程序运行期间,它被称为数百万次,并且分析器向我显示,大约80%的时间都用于呼叫abs().
我替换abs()了fabs()它并且它提供了大约10%的加速,这对我来说没有多大意义,因为我多次听说它们对于浮点数是相同的并且abs()应该总是使用.这是不真实的还是我错过了什么?
什么是评估双重绝对值的最快方法,可以进一步提高绩效?
如果重要的话,我g++在Linux X86_64上使用.
做所有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];
Run Code Online (Sandbox Code Playgroud)
哪里val有三个计算的结果.使用&而不是&&很重要.
这将删除您的分支预测问题.最后,确保循环代码可以看到实现,因此可以消除调用开销.