【发布时间】:2013-05-23 02:07:57
【问题描述】:
我正在分析我的代码并尽可能优化一切,最终得到一个看起来像这样的函数:
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% 的速度,这对我来说没有多大意义,因为我多次听说它们对于浮点数是相同的,abs()应该一直使用。这是不真实的还是我遗漏了什么?评估可进一步提高性能的双精度绝对值的最快方法是什么?
如果这很重要,我在 linux X86_64 上使用 g++。
【问题讨论】:
-
如果 IEEE,并且您想作恶并利用未定义的行为,您可以尝试
double x = a - b; *(uint64_t *)&x &= ~(1ULL << 63); return x / c; -
只是好奇 - a 是否永远等于 b?
-
@TonyD 假设不,这对我来说没关系。
标签: c++ performance c++11 profiling absolute-value