我一直在尝试优化我的一个数值程序,但遇到了一些谜团。我正在循环执行数千个浮点运算的代码,其中 1 次调用 pow
- 尽管如此,该调用占用了 5% 的时间......这不一定是一个关键问题,但它是很奇怪,所以我想了解发生了什么。
当我分析缓存未命中时,VS.NET 2010RC 的分析器报告说几乎所有缓存未命中都发生在 std::pow
中……那么……这是怎么回事?有更快的选择吗?我尝试了 powf
,但只是稍微快了一点;它仍然是异常数量的缓存未命中的原因。
为什么像 pow 这样的基本函数会导致缓存未命中?
编辑:这不是托管代码。 /Oi
内部函数已启用,但编译器可以选择忽略它。将 pow(x,y)
替换为 exp(y*log(x))
具有相似的性能 - 只是现在所有缓存未命中都在日志函数中。
最佳答案
是的..它很慢。至于为什么要详细,其他有信心的人可以尝试解释一下。
想加快速度吗?这里:http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/
关于c++ - std::pow 的性能 - 缓存未命中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484337/