Вопросы по производительности относительно async / await vs Promises и цикла обработки событий - PullRequest
0 голосов
/ 24 января 2019

Введение

Мой коллега и я обсуждали асинхронную природу JavaScript в браузере и задавались вопросом, каковы технические преимущества.Мы знаем, что async / await является синтаксическим сахаром для Promises, но нам интересно знать, есть ли какие-либо другие преимущества в производительности для использования одного над другим.Например:

  1. Обрабатывается ли цикл async / await и Promises одинаковым образом?
  2. Обе ли они считаются микрозадачами?
  3. Есть ли какая-либо выигрышная польза от выполнения одной над другой (например, код в исполнителе Promise вызывается синхронно, а как насчет асинхронных функций)??
  4. Согласно MDN, асинхронная функция возвращает объект AsyncFunction, но в документации Promise нет никаких рассуждений об этом - какие преимущества имеет AsyncFunction?
  5. Производительностьвыгоды одинаковы (если есть)?

Пример сценария

Являются ли

await JSON.parse('json string');

и

new Promise((resolve, reject) => resolve(JSON.parse('json string')));

лечениемТочно так же в цикле событий (мой синтаксис может быть немного отключен)?

Ссылки

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Обрабатывается ли цикл async / await и Promises одинаковым образом?

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

Они оба считаются микрозадачами?

Название «микрозадача» используется для объяснения общего поведения браузеров, ни спецификация, ни NodeJS не используют его, поэтому я бы никогда не сказал, что «xy - это микрозадача в JavaScript». Однако, если вы вызываете разрешение «микрозадачи», то возврат из асинхронной функции также является «микрозадачей», поскольку она разрешает основное обещание.

Есть ли какая-либо выигрыш в исполнении от использования одного над другим (например, код в исполнителе Promise вызывается синхронно, но как насчет асинхронных функций)?

Код всегда выполняется синхронно, асинхронность в JS означает, что внешние события (сетевые запросы, таймеры) когда-нибудь попадают в очередь событий, и поэтому код, присоединенный к нему через обратные вызовы, иногда вызывается, однако затем он выполняется синхронно.

Согласно MDN, асинхронная функция возвращает объект AsyncFunction, но в документации Promise это не обсуждается - какие преимущества имеет AsyncFunction?

Нет, он возвращает обещание, async function сам по себе является объектом AsyncFunction, что просто означает, что это FunctionObject с внутренним значением, говорящим, что он асинхронный.

 const asyncFunctionObject = new AsyncFunction("return await stuff();");

 async functionObject() { return await stuff(); }

Одинаковы ли преимущества производительности (если есть)?

Может быть. Это всегда зависит от вашего конкретного варианта использования, поэтому, если вы хотите знать его, обязательно проверьте производительность. Однако если вы посмотрите на эти два примера:

 // 1
 a().then(() => b()).then(() => c())

// 2
(async function() {
  await a();
  await b();
  await c();
})();

тогда в первом случае, если a, b и c - обещания, будет 5 обещаний (.then(...) возвращает новое обещание), в то время как во втором примере требуется только 4 (одно возвращено асинхронной функцией). Для петель соотношение станет еще лучше.

0 голосов
/ 24 января 2019

Если я правильно понимаю, движок может оптимизировать асинхронность / ждать больше. См. это объяснение от разработчиков V8, особенно этот вывод в конце:

поддерживает асинхронные функции и ожидает, прежде чем рукописный код обещания

...