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

    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

remquo版本:https://godbolt.org/z/NSMwyW

看起来主要区别在于remquo不内联,而天真代码是内联的。如果是这样,那么remquo的作用总是比手动代码慢的是什么?这是准确性问题(例如,对于大参数而言)还是不依赖(定义不明确)强制转换?

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

最佳答案

C99中添加了一个垃圾功能,以吸引Fortran编码人员切换到C。几乎没有理由真正使用它,因此库供应商避免浪费时间优化它。

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

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

10-02 21:14