Синхронизация и немедленное выполнение асинхронного теста производительности - PullRequest
0 голосов
/ 25 сентября 2018

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

Чтобы проверить это, я написал простой стенд для проверки.

const { performance } = require('perf_hooks');

const data = JSON.stringify((() => {
    const obj = {};
    for (let i = 0; i < 1000; i++) {
        obj[i] = i;
    }
    return obj;
})());

function convertSync (data) {
    return JSON.parse(data);
}

async function convertAsync (data) {
    return JSON.parse(data); 
}

const REPEAT_COUNT = 10000;

performance.mark("sync_start");
for (let i = 0; i < REPEAT_COUNT; i++) {
    convertSync(data);
}
performance.mark("sync_end");

performance.mark("async_start");
Promise.resolve()
    .then(async () => {
        for (let i = 0; i < REPEAT_COUNT; i++) {
            await convertAsync(data);
        }
        performance.mark("async_end");
    })
    .then(async () => {
        performance.measure("sync", "sync_start", "sync_end");
        performance.measure("async", "async_start", "async_end");

        console.log("REPEAT_COUNT", REPEAT_COUNT);
        console.log(performance.getEntries().filter(x => x.entryType === "measure"));
    }) 

Я использую Node v8.11.1 без каких-либо транспортеров и получаю следующие результаты.

PS D:\TestProjects\PerfTest\promisevssync> node .\index.js
REPEAT_COUNT 100000
[ PerformanceEntry {
    duration: 7825.5724,
    startTime: 383379071.208899,
    entryType: 'measure',
    name: 'sync' },
  PerformanceEntry {
    duration: 7836.966301,
    startTime: 383386896.834899,
    entryType: 'measure',
    name: 'async' } ]
PS D:\TestProjects\PerfTest\promisevssync> node .\index.js
REPEAT_COUNT 10000
[ PerformanceEntry {
    duration: 788.824201,
    startTime: 383405055.485299,
    entryType: 'measure',
    name: 'sync' },
  PerformanceEntry {
    duration: 798.591301,
    startTime: 383405844.370999,
    entryType: 'measure',
    name: 'async' } ]

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

  1. Является ли этот тест правильным?
  2. Почему?

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

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

Измерения верны, но обратите внимание, что измеряется производительность синхронной и асинхронной итерации, тогда как преобразование данных остается синхронным.

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

Этот тест с 10000 итерациями подтверждает это:

for (let i = 0; i < REPEAT_COUNT; i++) {}

vs

for (let i = 0; i < REPEAT_COUNT; i++) {
  await null;
}

Измерения составляют 0,5 мс для синхронного контура против 9 мс для асинхронного.

В отличие от пробного прогона, большая часть времени будет потрачена на JSON.parse(data).

0 голосов
/ 25 сентября 2018

Для работы async-await ваша функция должна вернуть обещание, которое не соответствует действительности.Таким образом, вы получаете похожие результаты, так как convertAsync не является действительно асинхронной функцией.Внутренне то, что делает javascript, заключает в себе вашу функцию в разрешенном обещании, и, поскольку ваше обещание почти немедленно разрешено, вы видите минимальный разброс в своих результатах.

Посмотрите на https://javascript.info/async-await

...