WebAssembly & Transferable, идеальное совпадение
В большинстве случаев мы запускаем код WebAssembly и Web Worker (или worker_thread в Node.js), чтобы предотвратить блокировку основного потока и поддержку адаптивного пользовательского интерфейса.
Для связи с Web Worker мы используем Window.postMessage() для отправки данных из основного потока в поток воркера. Иногда вам может потребоваться отправить мегабайты данных (особенно для мультимедийных приложений), и это приведет к длительному времени передачи данных и даже к исключению из-за нехватки памяти из-за характера postMessage() - клонирования данных из основного потока в рабочий веб-поток:
Чтобы решить эту проблему, вы можете использовать Transferable в postMessage()
, просто передать второй аргумент в postMessage(), и вы можете получить ускорение и экономию памяти без особых проблем.
// Без Transerable, для получения данных требуется до 2000 мс
const data = new UInt8Array(1024*1024*1024);
worker.postMessage(data);
// При использовании Transerable может получить до 100 мс
const data = new UInt8Array(1024*1024*1024);
worker.postMessage(data, [data.buffer]);
Проверьте демонстрацию в этом репозитории: https://github.com/jeromewu/web-worker-transferable-demo
Поскольку использование Transferable ускоряет передачу и экономит памяти, вы должны начать использовать его в своем приложении прямо сейчас.