Меня интересует сравнение производительности теста синхронного и асинхронного преобразования данных в случае, если асинхронная функция немедленно выдаст результат.Повлияет ли это на время выполнения?
Чтобы проверить это, я написал простой стенд для проверки.
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' } ]
Как видите, время выполнения одинаково.Для более высокого числа повторов количество пока не сильно отличается, поэтому я считаю, что это всего лишь нос.Такие результаты вызывают два вопроса:
- Является ли этот тест правильным?
- Почему?
Я понимаю, что что-то упустил, но похоже, что я забылпринять к сведению некоторые фундаментальные вещи.