c++ - 在 C++ 中加速双绝对值

标签 c++ performance c++11 profiling absolute-value

我正在分析我的代码并优化我能做的一切,归结为一个看起来像这样的函数:

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() 上。

  1. 我用 fabs() 替换了 abs() 并且它提供了大约 10% 的速度,这对我来说没有多大意义,因为我听到了很多多次它们对于 float 是相同的,并且应该始终使用 abs()。这是不真实的还是我遗漏了什么?

  2. 评估 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/

相关文章:

java - 如何加快文本转语音的初始化速度

c++ - 在当前 Linux 发行版上打包 C++11 软件是否安全?

c++ - 除了加密之外,还有什么方法可以防止访问文本文件吗?

c++ - shared_from_this 抛出 bad_weak_ptr 与 boost::asio

performance - 为什么我的 GLFW 窗口这么慢?

windows - 使用Electron时,MongoDb连接的初始化和查询非常慢

c++ - 关于get line和string find函数的问题

c++ - 如何在 ns3 中使用属性

c++ - std::move 是否应该用于 return-statements 以提高效率?

c++ - 在 [] 运算符的情况下,为 unordered_map 中的元素设置默认构造函数