Задать вопрос
Lite_stream
@Lite_stream

Почему параллельный Promise.all() на порядок медленнее, чем последовательные await'ы?

Запускается 10 последовательных обращений к БД ( под последовательностью подразумевается, что в каждый момент времени работает только 1 воркер из пула ).
Затем запускаются ( без ожиданий завершения предыдущего обращения к БД ) ещё столько же запросов, но в этом случае, в poll-очереди Event loop'а должны оказаться уже не 1, а 10 эвентов, соответственно ( в теории ) все воркеры будут загружены.
Однако на практике 2-й вариант работает более, чем на порядок медленнее

let start = process.hrtime();

    for(let i = 0; i < userIds.length ; i++)
    {
        await User.findOne( { _id: userIds[ i ] } );
    }

    console.log( 'Sequential time through Await: ' + process.hrtime( start ) );


    let findUserTasks = [ ];
    start = process.hrtime();

    for(let i = 0; i < userIds.length ; i++)
    {
        findUserTasks.push( User.findOne( { _id: userIds[ i ] } ) );
    }

    await Promise.all( findUserTasks );

    console.log( 'Parallel time through Promise.all: ' + process.hrtime( start ) );


Output:
Sequential time through Await: 0,22821906
Parallel time through Promise.all: 3,20166249

P.S.: При нарезке изображений разного размера с помощью модуля Sharp, Promise.all(), как и предполагалось, показывает себя намного быстрее, чем последовательные await'ы
  • Вопрос задан
  • 373 просмотра
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 1
Lite_stream
@Lite_stream Автор вопроса
Нашёл некоторую информацию: на SO предполагают, что дело может быть в том что сам Mongo немного по-разному ведёт себя, когда к нему за единицу времени стучится 1 или несколько запросов
Та же проблема на SO
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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