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

标签 c++ multithreading emscripten webassembly

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

https://github.com/bsergeev/MtMergeSort

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

Comparison of x64 vs. WebAssembly vs. JavaScript

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

最佳答案

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

关于c++ - 浏览器中的多线程 WebAssembly 比单线程慢,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729084/

相关文章:

c++ - 我可以直接在我的对象上调用重载的括号吗?

c++ - 如何使用GetNumaProximityNode (Win7+)?

c++ - 使用 Emscripten 构建静态或共享的 boost 库

c++ - 实现计数排序

c++ - 运算符 << - 参数评估的顺序

c++ - 两个线程使用同一个变量

c# - 如何在 C#.NET 的循环中创建不确定的后台线程

ios - 如何确定哪个进程应该在主线程上运行? iOS系统

c - 如何将 char* 参数传递给在 Node.js 中执行的 C 方法?

c++ - 如何通过 'emcc' 传递 'emcmake cmake/emmake make' 选项?