Javascript Postmessage Webworker очень медленно, даже с короткими сообщениями строки - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь отправить строку веб-работнику, используя postMessage. Это последовательно занимает> 100 мсек. это соответствующий код в главном потоке

return new Promise(function(resolve, reject) {
  let w = new Worker(<webworker_url>)
  w.onmessage = function(e) {
    resolve(e.data);
  }
  console.log(Date.now());
  w.postMessage('test text');
  w.onerror = reject;
});

регистрация времени непосредственно в onmessage в веб-приложении

onmessage = function(e) {
   console.log(Date.now());
   ...
}

время, показанное в консоли, превышает 100 мс, переключение браузеров chrome dev или chrome канарейка помогает, но не опускает ее за 50 мс, что все еще очень медленно, насколько я понимаю.

Неужели мое понимание скорости PostMessage неверно? Или мой код неверен?

1 Ответ

0 голосов
/ 02 марта 2020

Проблема в том, что вы создаете новый WebWorker с каждым вызовом этого обещания. Создание веб-работника сопряжено с большими трудностями - браузер должен запустить новый движок JS, разобрать javascripts et c.

Вам необходимо каким-то образом кэшировать инициализированный работник или предоставить его обещанию. , Затем вам нужно будет создать систему, чтобы определить, какое сообщение принадлежит какому-либо обещанию. Некоторая начальная идея:

let _cachedWorker = null;
let _uniqueMessageId = 0;
function _getWorker() {
  if(_cachedWorker == null) {
    _cachedWorker = new Worker(<webworker_url>);
  }
  return _cachedWorker;
}

function WorkerOperationPromise(messageData) {
  return new Promise(function(resolve, reject) {
    let w = _getWorker();
    const currentMessageId = ++_uniqueMessageId;
    w.addEventListener("message", function(e) {
      if(e.data.messageId == currentMessageId) {
        resolve(e.data.messageData);
        // You MUST! also remove this listener somehow
      }
    });
    w.postMessage({messageId: currentMessageId, messageData});
  });
}

Или используйте какой-нибудь фреймворк RP C, который уже может это сделать.

...