代码之家  ›  专栏  ›  技术社区  ›  Jack G

`等待`比Chrome中的速度慢

  •  5
  • Jack G  · 技术社区  · 7 年前

    await ,我揭开了一个令人困惑的谜团。我在控制台中分别运行了以下代码片段数次,以过滤掉侥幸心理,并计算了相关数据的平均运行次数。

    (function(console){
        "use strict";
        console.time();
        var O = [1];
        for (var i=0; i !== 107000; ++i) {
            const O_0 = O[0];
            O[0] = O_0;
        }
        console.timeEnd();
    })(console);
    

    导致: default: 5.322021484375ms

    async

    (async function(console){
        "use strict";
        console.time();
        var O = [1];
        for (var i=0; i !== 107000; ++i) {
            const O_0 = O[0];
            O[0] = O_0;
        }
        console.timeEnd();
    })(console);
    

    很好!Chrome知道它的东西。非常低的开销: default: 8.712890625ms

    接下来,我尝试添加

    (async function(console){
        "use strict";
        console.time();
        var O = [1];
        for (var i=0; i !== 107000; ++i) {
            const O_0 = O[0];
            O[0] = await O_0;
        }
        console.timeEnd();
    })(console);
    

    default: 724.706787109375ms

    所以,一定有逻辑上的原因,对吧?我试着比较之前的类型。

    (async function(console){
        "use strict";
        console.time();
        var O = [1];
        for (var i=0; i !== 107000; ++i) {
            const O_0 = O[0];
            O[0] = typeof O_0 === "object" ? await O_0 : O_0;
        }
        console.timeEnd();
    })(console);
    

    好吧,不是这样的: default: 6.7939453125ms

    因此,必须是承诺部分:检查传递给wait的项目是否是承诺。那一定是罪魁祸首,我是对的还是对的?

    (async function(console, Promise){
        "use strict";
        const isPromise = Promise.prototype.isPrototypeOf.bind(Promise);
        console.time();
        var O = [1];
        for (var i=0; i !== 107000; ++i) {
            const O_0 = O[0];
            O[0] = isPromise(O_0) ? await O_0 : O_0;
        }
        console.timeEnd();
    })(console, Promise);
    

    这将导致: default: 7.2041015625ms

    好吧,好吧,让我们先来猜疑一下。让我们假设一下,他们等待的远远不够完美。

    (async function(console, Promise){
        "use strict";
        const isPromise = Promise.prototype.isPrototypeOf.bind(Promise.prototype);
        console.time();
        var O = [1];
        for (var i=0; i !== 107000; ++i) {
            const isAnObject = typeof O[0] === "object" ? true : false;
            const isThisAPromise = isPromise(O[0]);
            O[0] = isAnObject && isThisAPromise ? await O[0] : O[0];
        }
        console.timeEnd();
    })(console, Promise);
    

    但即使这样也无法解释 等待 : default:7.85498046875ms

    等待 至少比现在快100倍。我想不出一个好的理由来解释为什么在一个完美的世界里它不会快100倍。然而,我们并不是生活在一个完美的世界里,所以有一个问题:如何生活?怎样?怎么这么慢?有没有希望它在未来更快(比如说,大约快100倍)?我正在寻找事实和对这个问题的客观分析,以解释我在上述性能测试中看到的令人费解的谜团。

    1 回复  |  直到 7 年前
        1
  •  10
  •   Josh Lee ZZ Coder    7 年前

    你很容易 await 表达和缺乏。至少,你要求引擎 在微任务队列中,可能正在执行由于I/O完成而发生的其他工作。鉴于此,这不可能优化为零。

    如果你真的想让CPU转几毫秒,不要写 .

    下面是一个例子。它打印出来了 1 2 3 .

    Promise.resolve().then(()=>console.log(2));
    
    (async()=>{
      console.log(1);
      await undefined;
      console.log(3);
    })();

    await undefined 不是“什么都不做”的说法。这是JavaScript的协作多任务处理。