Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同步与即时异步执行性能测试台_Javascript_Node.js_Promise_Async Await - Fatal编程技术网

Javascript 同步与即时异步执行性能测试台

Javascript 同步与即时异步执行性能测试台,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我对同步和异步数据转换测试的性能比较感兴趣,以防异步函数立即返回结果。这会影响执行时间吗 为了检查这一点,我写了一个简单的工作台来检查 const { performance } = require('perf_hooks'); const data = JSON.stringify((() => { const obj = {}; for (let i = 0; i < 1000; i++) { obj[i] = i; } retu

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

为了检查这一点,我写了一个简单的工作台来检查

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"));
    }) 
正如您所看到的,执行时间是相同的。对于更高的重复计数数字仍然没有太大的差别,所以我相信这只是一个鼻子。这些结果提出了两个问题:

  • 这个测试正确吗
  • 为什么?

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

    对于async wait to work,您的函数应该返回一个承诺,但事实并非如此。由于convertAsync不是真正的异步函数,所以您得到了类似的结果。javascript在内部所做的是将您的函数包装在已解决的承诺中,由于您的承诺几乎立即得到了解决,您可以在结果中看到最小的差异


    请查看

    有关async Wait to work的信息,您的函数应该返回一个承诺,但事实并非如此。由于convertAsync不是真正的异步函数,所以您得到了类似的结果。javascript在内部所做的是将您的函数包装在已解决的承诺中,由于您的承诺几乎立即得到了解决,您可以在结果中看到最小的差异

    看看

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

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

    Node.js具有高分辨率计时器,因此承诺本身只会引入一点延迟 与花在
    convertAsync
    调用上的时间相比,这可以忽略不计

    这项10000次迭代的测试证实了这一点:

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

    for(让i=0;i
    同步回路的测量值为0.5ms,异步回路的测量值为9ms

    与干运行相反,大部分时间将花在
    JSON.parse(数据)

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

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

    Node.js具有高分辨率计时器,因此承诺本身只会引入一点延迟 与花在
    convertAsync
    调用上的时间相比,这可以忽略不计

    这项10000次迭代的测试证实了这一点:

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

    for(让i=0;i
    同步回路的测量值为0.5ms,异步回路的测量值为9ms


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

    “以防异步函数立即返回结果…”上。函数完全是异步的毫无意义。让我们从开始,为什么假设“异步”代码应该比同步版本慢?请注意,您使用的是不推荐使用的perf_hooks API,它在节点10中不起作用@Thomas您可以预期异步循环本身会有相当大的滞后,而promise实现效率较低。然而,这不是节点中的问题。@Bergi,它是接口所必需的。我正在制作一些通用接口,它必须是异步的,所以我担心性能调用,因为设计接口时每个循环调用可能会有几千个调用。@estus,你能描述一下为什么它在节点中不是问题吗?区别是什么?“如果异步函数将立即返回结果…”该函数完全不是异步的。首先,为什么您认为“异步”代码应该比同步版本慢?请注意,您使用的是不推荐使用的perf_hooks API,在节点10中不起作用@Thomas您可以预期异步循环本身会有相当大的滞后,而promise实现效率较低。然而,这不是节点中的问题。@Bergi,它是接口所必需的。我正在制作一些通用接口,它必须是异步的,所以我担心性能调用,因为设计接口时每个循环调用可能会有几千个调用。@estus,你能描述一下为什么它在节点中不是问题吗?有什么区别?也许我不清楚,但是是的,我只关注同步和异步方法之间的增量时间,而不是绝对增量时间。它很小,我想知道为什么,正如我所确信的,基于承诺的版本,即使立即产生结果,也会明显地慢一些,但不会慢几毫秒。如此低的偏差甚至可能被视为噪音。在浏览器中差异可能更大。由于事件循环的工作方式,它在节点中的效率更高。是的,可能是噪音。由于这个原因,对于统计上正确的基准来说,一个循环可能是不够的。使用可能我不清楚,但是的,我只关注同步和异步方法之间的增量时间,而不是绝对时间。它很小,我想知道为什么,正如我所确信的,基于承诺的版本,即使立即产生结果,也会明显地慢一些,但不会慢几毫秒。如此低的偏差甚至可能被视为噪音。在浏览器中差异可能更大。由于事件循环的工作方式,它在节点中的效率更高。是的,可能是噪音。由于这个原因,对于统计上正确的基准来说,一个循环可能是不够的。使用
    for (let i = 0; i < REPEAT_COUNT; i++) {
      await null;
    }