Задать вопрос
M4mkin_pr0ger
@M4mkin_pr0ger
Хачу пырфоманс

Почему Worker медленнее основного потока?

Делаю симуляцию, где нужно каждый кадр совершать расчет (в идеале 60 FPS, ну или хотя бы 30 FPS)
Решил потыкать воркеры, т.к. давно хотел, и спустя внушительный рефакторинг, перенеся весь алгоритм в воркер, я получил 0.5 FPS при изначальных 60 FPS в основном потоке, весело))

Детали:
  • Запросы к воркеру предельно минимизированы
  • Изучал профайлер, так что точно уверен, что тот же самый код в воркере выполняется значительно медленнее
  • Единственный постоянный запрос - это ответ в main-thread, однако передается там только ArrayBuffer способом Transferable


Предположение: Возможно, я не правильно использую воркер, конкретно, он имеет в своем скоупе состояние, которое и обновляется независимо, и его результат уже посылается в main-thread:
import WorkerLiquid from './liquid';

const liquid = new WorkerLiquid(self); // Собственно, состояние

self.onmessage = function (event) {
  const [methodid, args] = event.data;
  liquid.methodsList[methodid](...args);
};


Вопросы:
  1. Неужели воркер в своей сути - это не полноценная среда JS, но в другом потоке? (Видимо, я перепутал в нодовскими кластерами)
  2. Какие есть нюансы в работе воркера?
  3. Если воркер дожен быть только простой функцией, то допустимо ли создавать набор из пр. 5-20 воркеров?


УПД: Проверил соотношение перфоманса мейн треда к воркеру, профайлер говорит, что "время таска" (т.е. одного кадра) в мейне - 6мс, в воркере 120мс, что за магия такая))
УПД №2: А так же воркер дает еще и лютые деффекты в вычислениях
  • Вопрос задан
  • 583 просмотра
Подписаться 8 Средний 10 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы