我有一些非常简单的基准测试,通过 Catch2 运行,并使用 -O3 进行编译:
emscripten 3.1.37
我预计 JavaScript 和 WebAssembly 之间不会有太大差异,但有:
BENCHMARK("cpp sin only")
{
double sum = 1.0;
for (int t = 0; t < 2000000; ++t) {
sum += sin(double(t));
}
return sum;
};
#ifdef __EMSCRIPTEN__
BENCHMARK("js sin only")
{
EM_ASM_DOUBLE({
let sum = 1;
for (let i = 0; i < 2000000; i++) {
sum = sum + Math.sin(i);
}
return sum;
});
};
#endif
原生,用
chrome:
benchmark name samples iterations est run time
mean low mean high mean
std dev low std dev high std dev
-------------------------------------------------------------------------------
cpp sin only 100 1 7.93775 s
79.3856 ms 79.147 ms 79.7195 ms
1.43061 ms 1.10437 ms 1.97222 ms
js sin only 100 1 2.21506 s
22.1354 ms 22.0064 ms 22.3 ms
742.138 us 614.746 us 901.128 us
编译,我得到24.2ms。
据我了解,JavaScript 对所有数字都使用双精度浮点数。所以比较应该是公平的。在 C++ 版本中使用 float 时,在 chrome 中会达到 12 毫秒,但这仍然较慢(且精度较低)。 FF 约为 30 毫秒。GCC 12.3.0
(我根据评论中的请求运行了几个额外的基准测试):
g++12 比 clang15 快一点,但在 10% 以内在用户21489919
评论之后,我向emscripten报告了该问题。
您可以通过使用 .c 而不是 .cpp 和 #include
. 来双重确保使用常规双精度。