基准测试超过 CPU 频率

Benchmark exceeding CPU frequency

本文关键字:频率 CPU 基准测试      更新时间:2023-10-16

我正在使用 benchmark.js 来计时函数的两个版本,一个在 JS 中,一个在 C++ 中(节点.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

如果没有更多的上下文,很难确切地说出来,但可能是以下一项或多项:

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

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

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