我感兴趣的是同步和异步数据转换测试的性能比较,以防异步函数立即返回结果。这会影响执行时间吗?
为了检查这一点,我写了一个简单的长凳来检查。
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"));
}) 我使用Nodev8.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' } ]正如您所看到的,执行时间是相同的。对于较高的重复计数数字仍然没有太大的不同,所以我相信这只是一个鼻子。这些结果提出了两个问题:
我知道我遗漏了一些东西,但我似乎忘了把一些基本的东西考虑进去。
发布于 2018-09-25 17:59:38
对于异步等待工作,您的函数应该返回一个承诺,但情况并非如此。因此,您将得到类似的结果,因为convertAsync不是真正的异步函数。在内部,javascript所做的是将您的函数封装在已解决的承诺中,并且由于您的承诺几乎立即被解决,所以您在结果中看到的差别是最小的。
发布于 2018-09-25 18:18:43
我感兴趣的是同步和异步数据转换测试的性能比较,以防异步函数立即返回结果。这会影响执行时间吗?
度量是正确的,但请注意,所测量的是同步和异步迭代的性能,而数据转换保持同步。
Node.js有高分辨率的计时器,因此承诺只会带来一个相对于convertAsync调用所花费的时间来说微不足道的轻微滞后。
这个经过10000次迭代的测试证实了这一点:
for (let i = 0; i < REPEAT_COUNT; i++) {}vs
for (let i = 0; i < REPEAT_COUNT; i++) {
await null;
}同步循环的测量值为0.5ms,异步循环的测量值为9ms。
与模拟运行相比,大部分时间将花在JSON.parse(data)上。
https://stackoverflow.com/questions/52504141
复制相似问题