在某些内部循环中,我有:
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
如此之慢令我感到惊讶。
答案 0 :(得分:3)
这是C99中添加的一个垃圾功能,用于诱使Fortran编码人员切换到C。没有什么理由真正使用它,因此库供应商避免浪费时间对其进行优化。
另请参阅:What does the function remquo do and what can it be used for?。
顺便说一句,如果您假设i
得到了商,请仔细阅读文档! (或阅读上一段链接的问题的答案)。