Сколько стоит производительность для ожидания уже выполненного Обещания? - PullRequest
0 голосов
/ 24 ноября 2018

Во время анализа кода я недавно сталкивался с такими блоками кода:

const promises = [];
const data = [];
for (let piece of pieces) {
  for (let chunk of piece) {
    promises.push(execute(chunk)); //execute returns a promise which is not yet fulfilled
  }
  data = await Promise.all(promises);
}

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

const data = [];
for (let piece of pieces) {
  const promises = [];
  for (let chunk of piece) {
    promies.push(execute(chunk)); //execute returns a promise which is not yet fulfilled
  }
  data.push(... await Promise.all(promises));
}

В конце data будет таким жев обоих случаях.

Я понимаю, как data заполняется в обоих случаях.Я хотел бы знать, какова нагрузка на производительность в ожидании уже выполненного обещания (что происходит в первом блоке кода) и является ли это значительным?

1 Ответ

0 голосов
/ 24 ноября 2018

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

Затраты времени обработки не будут значительными по сравнению с фактической асинхронной работой, выполняемой в вашей функции execute.

Однако независимо от того, насколько мализдержки, связанные с первой версией вашего кода, заключаются в том, что его сложность во время выполнения является квадратичной: Promise.all необходимо каждый раз повторять весь массив promises.Чем больше кусков * у вас есть, тем более выраженным будет эффект.Я согласен с вашими отзывами и рекомендую вторую версию кода.

...