std :: pow的性能 - 缓存未命中?

Eam*_*nne 7 c++ cpu profiling caching

我一直在努力优化我的数字程序,并且遇到了一些神秘的问题.我循环执行数千个浮点运算的代码,其中1个调用pow- 然而,该调用占用了5%的时间......这不一定是关键问题,但它很奇怪,所以我想要了解发生了什么.

当我查找缓存未命中时,VS.NET 2010RC的分析器报告几乎所有缓存未命中都发生在std::pow......所以......那是什么?有更快的替代方案吗?我试过了powf,但那只是稍快一点​​; 它仍然是异常缓存未命中数的原因.

为什么像pow这样的基本功能会导致缓存未命中?

编辑:这不是托管代码. /Oi内在函数已启用,但编译器可以选择忽略它.更换pow(x,y)exp(y*log(x))具有类似的性能-刚才所有的高速缓存未命中都在日志功能.

Bil*_*ill 1

如果换成std::pow(var)其他函数,比如std::max(var, var),它还占用 5% 吗?您仍然会遇到所有缓存未命中情况吗?

我猜时间不会,缓存未命中是。计算幂比许多其他操作要慢(您使用的是哪个?)。调用不在缓存中的代码将导致缓存未命中,无论它是哪个函数。