为什么std :: remquo这么慢?

时间:2019-08-05 06:24:35

标签: c++ c++11 division cmath

在某些内部循环中,我有:

    double x;
    ...
    int i = x/h_;
    double xx = x - i*h_;

我认为这样做可能是更好的方法,我尝试了std::remquo

    double x;
    ...
    int i;
    double xx = std::remquo(x, h_, &i);

突然,计时从2.6秒变为40秒(对于循环的许多执行而言)。

时序测试很难在这里复制,但是我做了一个在线代码,看是否有人可以帮助我了解正在发生的事情。

原始版本:https://godbolt.org/z/PnsfR8

更新版本:https://godbolt.org/z/NSMwyW

看起来主要区别在于remquo不内联,而天真代码为内联。如果是这样的话,remquo的作用总是比手册代码慢吗?是精度问题(例如,用于大参数的问题)还是不依赖(定义不明确的)转换转换?


我刚刚意识到remquo版本甚至没有做与第一个代码相同的操作。所以我用错了。无论如何,remquo如此之慢令我感到惊讶。

1 个答案:

答案 0 :(得分:3)

这是C99中添加的一个垃圾功能,用于诱使Fortran编码人员切换到C。没有什么理由真正使用它,因此库供应商避免浪费时间对其进行优化。

另请参阅:What does the function remquo do and what can it be used for?

顺便说一句,如果您假设i得到了商,请仔细阅读文档! (或阅读上一段链接的问题的答案)。