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

Multithreaded WebAssembly slower in browser than singlethreaded, why?

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

https://github.com/bsergeev/MtMergeSort

令人惊讶的是,虽然此代码编译为 WebAssembly 并在 Chrome 中运行,但随着使用多线程,浏览器中的排序变得越来越慢(而单线程性能如预期的那样为 1.5...2比原生代码慢 1 倍:原生代码 1.80 秒,WebAssembly 3.1...3.3 秒,JavaScript 4.69 秒):

浏览器限制 WebWorker 是否导致多线程性能下降?但是那么 WebAssembly 中的多线程有什么意义呢?

原来罪魁祸首是在 merge() 中的不同线程上分配了 left/right 临时数组。一旦我在主线程上预先分配了临时数组,WebAssembly 就可以很好地缩放: