在某些内部循环中,我有:
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
获得了存储在其中的商,请仔细阅读文档! (或阅读上一段链接的问题的答案)。