我一直在尝试优化我的数字程序,并且遇到了一个谜。我正在遍历执行数千个浮点运算的代码,但是其中1次调用pow
-尽管如此,该调用花费了5%的时间...这不一定是关键问题,但这很奇怪,所以我想了解发生了什么。
当我对缓存未命中进行概要分析时,VS.NET 2010RC的概要分析器报告几乎所有的缓存未命中都发生在std::pow
中……所以……这是怎么回事?有更快的选择吗?我尝试了powf
,但这只是稍微快一点;它仍然是导致高速缓存未命中次数异常的原因。
为什么像pow这样的基本功能会导致高速缓存未命中?
编辑:这不是托管代码。启用了/Oi
内部函数,但是编译器可以选择忽略它。用pow(x,y)
替换exp(y*log(x))
具有相似的性能-刚才所有的高速缓存未命中都在log函数中。
最佳答案
如果将std::pow(var)
替换为std::max(var, var)
等其他函数,它是否仍占5%?您是否仍然获得所有缓存未命中?
我猜按时不对,对缓存未命中则是。计算能力比许多其他操作(您正在使用?)要慢。调出不在缓存中的代码将导致缓存未命中,无论函数是什么。
关于c++ - std::pow的性能-缓存未命中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2484337/