首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步与即时异步执行性能工作台

同步与即时异步执行性能工作台
EN

Stack Overflow用户
提问于 2018-09-25 17:54:12
回答 2查看 116关注 0票数 0

我感兴趣的是同步和异步数据转换测试的性能比较,以防异步函数立即返回结果。这会影响执行时间吗?

为了检查这一点,我写了一个简单的长凳来检查。

代码语言:javascript
复制
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,没有任何转发器,并得到以下结果。

代码语言:javascript
复制
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. 为什么?

我知道我遗漏了一些东西,但我似乎忘了把一些基本的东西考虑进去。

EN

回答 2

Stack Overflow用户

发布于 2018-09-25 17:59:38

对于异步等待工作,您的函数应该返回一个承诺,但情况并非如此。因此,您将得到类似的结果,因为convertAsync不是真正的异步函数。在内部,javascript所做的是将您的函数封装在已解决的承诺中,并且由于您的承诺几乎立即被解决,所以您在结果中看到的差别是最小的。

看看https://javascript.info/async-await

票数 2
EN

Stack Overflow用户

发布于 2018-09-25 18:18:43

我感兴趣的是同步和异步数据转换测试的性能比较,以防异步函数立即返回结果。这会影响执行时间吗?

度量是正确的,但请注意,所测量的是同步和异步迭代的性能,而数据转换保持同步。

Node.js有高分辨率的计时器,因此承诺只会带来一个相对于convertAsync调用所花费的时间来说微不足道的轻微滞后。

这个经过10000次迭代的测试证实了这一点:

代码语言:javascript
复制
for (let i = 0; i < REPEAT_COUNT; i++) {}

vs

代码语言:javascript
复制
for (let i = 0; i < REPEAT_COUNT; i++) {
  await null;
}

同步循环的测量值为0.5ms,异步循环的测量值为9ms。

与模拟运行相比,大部分时间将花在JSON.parse(data)上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52504141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档