我使用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
答案 0 :(得分:2)
很难说没有更多的背景,但可能是以下一个或多个:
编译器使用PSHUFB等指令一次交换多个元素。 (PSHUFB可以在支持AVX2的处理器上一次最多交换16个字。)
流水线效果允许处理器同时处理此循环的多次迭代。
您的基准测试存在问题,导致整个计算得以优化。 (不太可能但值得一提。)