基准超过CPU频率

时间:2016-06-02 04:11:18

标签: c++ benchmarking

我使用benchmark.js计时函数的两个版本,一个在JS中,一个在C ++中(一个node.js绑定)。

C ++版本是一个带有单个编译器内部的for循环(2个循环延迟+ 0.5个循环吞吐量):

for (size_t i = 0; i < arrlen; i++) {
#if defined(_MSC_VER)
    (*events)[i] = _byteswap_ushort((*events)[i]);
#elif defined(__GNUC__)
    (*events)[i] = __builtin_bswap16((*events)[i]);
#endif
}

我希望它很快......但它的时钟速度比我的CPU频率(4.0 GHz)快。怎么会发生这种情况? (我已经测试过该功能在基准套件之外工作。)

native: 17,253,787,071 elements/sec (10k elements in array * 1,725,379 calls/sec)
JS: 846,298,297 elements/sec (10k elements in array * 84,630 calls/sec)
// both ~90 runs sampled

1 个答案:

答案 0 :(得分:2)

很难说没有更多的背景,但可能是以下一个或多个:

  • 编译器使用PSHUFB等指令一次交换多个元素。 (PSHUFB可以在支持AVX2的处理器上一次最多交换16个字。)

  • 流水线效果允许处理器同时处理此循环的多次迭代。

  • 您的基准测试存在问题,导致整个计算得以优化。 (不太可能但值得一提。)