Многопоточная WebAssembly медленнее в браузере, чем однопоточная, почему? - PullRequest
0 голосов
/ 17 февраля 2019

После того, как Emscripten не использовался в течение нескольких лет, я недавно обнаружил, что он теперь поддерживает компиляцию многопоточного кода C ++ в WebAssembly.Я собрал простой код сортировки слиянием, который сортирует 10 миллионов операций с плавающей запятой (собственный код может легко сортировать больше, чем это, но браузеры, кажется, ограничивают вас до 1 ГБ памяти):

https://github.com/bsergeev/MtMergeSort

Удивительно, но хотя этот код компилируется в WebAssembly и выполняется в Chrome, сортировка в браузере замедляется при использовании нескольких потоков (в то время как производительность одного потока, как и ожидалось, в 1,5 ... 2 раза ниже, чем собственная: собственный код1,80 секунды, WebAssembly 3,1 ... 3,3 секунды и JavaScript 4,69 секунды):

Comparison of x64 vs. WebAssembly vs. JavaScript

Это снижение производительности в нескольких потоках, вызванное замедлением работы браузераWebWorkers?Но в чем тогда смысл нескольких потоков в WebAssembly?

1 Ответ

0 голосов
/ 25 марта 2019

Оказалось, что виновником было выделение левого / правого временных массивов в разных потоках в merge().Как только я предварительно выделил временный массив в основном потоке, WebAssembly хорошо масштабировалась: Multi-threaded performance

...