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

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

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

мои исследования говорят о том, что этот код может быть на самом деле вредное представление. Тем не менее, я не смог найти никакого надежного источника, поддерживающего это. Мои единственные два открытия:--4-->

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

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

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

5 ответов


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


Примечания:

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

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

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

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


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

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

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


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

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

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

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


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

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

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

Edit: еще одно хорошее чтение было бы:мнение о синхронных запросах в web workers