多线程 WebAssembly 在浏览器中比单线程慢,为什么?

Bor*_*ris 4 c++ multithreading emscripten webassembly

几年没有使用 Emscripten 后,我最近发现它现在支持将多线程 C++ 代码编译为 WebAssembly。我已经编写了简单的合并排序代码,可以对 1000 万个浮点进行排序(本机代码可以轻松地对更多浮点进行排序,但浏览器似乎将您限制为 1GB 内存):

https://github.com/bsergeev/MtMergeSort

令人惊讶的是,虽然这段代码编译为 WebAssembly 并在 Chrome 中运行,但由于使用了多个线程,浏览器中的排序速度变得越来越慢(而单线程性能,正如预期的那样,是本机性能的 1.5...2 倍:本机代码1.80 秒,WebAssembly 3.1...3.3 秒,JavaScript 4.69 秒):

x64、WebAssembly 和 JavaScript 的比较

多线程性能下降是否是由于浏览器限制 WebWorkers 造成的?那么 WebAssembly 中的多线程有什么意义呢?

Bor*_*ris 6

事实证明,罪魁祸首是在merge(). 当我在主线程上预分配临时数组后,WebAssembly 就可以很好地扩展: 多线程性能