Подтвердить что ты не робот

Веб-работники, обрабатывающие вызовы AJAX - оптимизация overkill?

Я работаю с кодом, который обрабатывает все запросы AJAX с помощью веб-рабочих (если они доступны). Эти работники выполняют почти ничего, кроме XMLHttpRequest обработки объектов (без дополнительных вычислений). Все запросы, созданные рабочими, являются асинхронными (request.open("get",url,true)).

В последнее время у меня появилось несколько вопросов относительно этого кода, и я начал задаваться вопросом, стоит ли мне тратить время на исправление этого или просто свалить все решение.

Мои исследования пока показывают, что этот код может на самом деле повредить производительность. Однако я не смог найти надежного источника, поддерживающего это. Мои только две находки:

  • 2-летний предложение функции jQuery для использования веб-работников для вызовов AJAX
  • this SO вопрос, который, кажется, спрашивает о чем-то немного другом (используя синхронные запросы в веб-рабочих против вызовов AJAX)

Может ли кто-нибудь указать мне на надежный источник, обсуждающий эту проблему? Или, есть ли тесты, которые могут развеять мои сомнения?

[ EDIT] Этот вопрос становится немного интереснее, когда WebWorker также отвечает за анализ результата (JSON.parse). Асинхронный синтаксический анализ улучшает производительность?

4b9b3361

Ответ 1

Я создал правильный тег для jsperf. В зависимости от браузера подход WebWorker на 85-95% медленнее, чем обычный вызов ajax.


Примечания:

  • так как время отклика сети может отличаться для каждого запроса, я тестирую только new XMLHttpRequest() и JSON.parse(jsonString);. Нет реальных вызовов AJAX.
  • Операции настройки и удаления WebWorker измеряются не
  • Обратите внимание, что я тестирую один запрос, результаты для подхода webworker могут быть лучше для нескольких одновременных запросов.
  • Calvin Metcalf объяснил мне, что сравнение sync и async на jsperf не даст точных результатов, и он создал еще один тест, который устраняет асинхронные издержки. Результаты по-прежнему показывают, что подход WebWorker значительно медленнее.
  • Из обсуждения Reddit я узнал, что данные, переданные между главной страницей и WebWorker, копируются и должны быть сериализованы в процессе. Поэтому использование WebWorker для синтаксического анализа не имеет особого смысла, поэтому данные должны быть сериализованы и десериализованы, прежде чем вы сможете использовать их на главной странице.

Ответ 2

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

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

Предостережение, которое я слышал, но не подтверждено, заключается в том, что работники используют другой кеш, чем основная страница, так что если одни и те же ресурсы загружаются в основной поток и рабочий, это может вызвать значительное дублирование усилий.

Ответ 3

Вы оптимизируете свой код в неположенном месте.

Запросы AJAX уже выполняются в отдельном потоке и возвращаются в цикл основного события, как только они выполняются (и вызывают определенную функцию обратного вызова).

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

Ответ 4

Асинхронный IO является важной концепцией Javascript.

Во-первых, ваш запрос уже асинхронен, IO не блокируется, и во время вашего запроса вы можете запустить любой другой код Javascript. Выполнение обратного вызова у рабочего гораздо интереснее запроса.

Во-вторых, механизмы Javascript выполняют весь код в том же потоке, если вы создаете новые потоки, вам необходимо обрабатывать передачу данных с помощью employee message api (см. Semaphore).

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

Ответ 5

По моему опыту, веб-рабочие не должны использоваться для вызовов AJAX. Прежде всего, они асинхронны, что означает, что код будет работать, пока вы ждете, когда информация вернется.

Теперь, используя рабочего для обработки ответа, определенно вы можете использовать Web Worker. Некоторые примеры:

  • Анализ ответа на создание большой модели
  • Вычисление больших объемов данных из ответа
  • Использование общего веб-рабочего с механизмом шаблона в сочетании с ответом AJAX для сборки HTML, который затем будет возвращен для добавления в DOM.

Изменить: другое хорошее чтение будет: Мнение о синхронных запросах в веб-работниках