【发布时间】:2023-03-29 19:30:01
【问题描述】:
我对同步和异步数据转换测试的性能比较感兴趣,以防异步函数立即返回结果。这会影响执行时间吗?
为了检查这一点,我写了简单的 bench 来检查。
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' } ]
如您所见,执行时间是相同的。对于更高的重复计数数字仍然没有太大差异,所以我相信这只是一个鼻子。这样的结果提出了两个问题:
- 这个测试正确吗?
- 为什么?
我知道我遗漏了一些东西,但似乎我忘了考虑一些基本的东西。
【问题讨论】:
-
"如果异步函数会立即返回结果......" 函数是异步的毫无意义。
-
让我们开始吧,为什么你认为“异步”代码应该比同步版本慢?
-
请注意,您正在使用已弃用的 perf_hooks API,该 API 在 Node 10 中不起作用。@Thomas 您可以预期异步循环本身会出现相当大的延迟,并且承诺实现效率较低。但是,这在 Node 中不是问题。
-
@Bergi,接口需要。我正在制作一些通用接口,它需要是异步的,所以我担心性能调用,因为设计接口可能会在每个循环调用中处理几千个调用。
-
@estus,您能否描述一下为什么它在 Node 中不是问题?有什么区别?
标签: javascript node.js promise async-await