基准超过 CPU 频率
Benchmark exceeding CPU frequency
我正在使用 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
如果没有更多上下文,很难准确地说,但可能是以下一项或多项:
编译器正在使用 PSHUFB 等指令一次对多个元素进行字节交换。 (在支持 AVX2 的处理器上,PSHUFB 一次最多可以交换 16 个字。)
流水线效应允许处理器同时处理此循环的多次迭代。
您的基准测试存在问题,导致整个计算被优化掉。 (不太可能但值得一提。)
我正在使用 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
如果没有更多上下文,很难准确地说,但可能是以下一项或多项:
编译器正在使用 PSHUFB 等指令一次对多个元素进行字节交换。 (在支持 AVX2 的处理器上,PSHUFB 一次最多可以交换 16 个字。)
流水线效应允许处理器同时处理此循环的多次迭代。
您的基准测试存在问题,导致整个计算被优化掉。 (不太可能但值得一提。)