Javascript 关于异步/等待vs承诺和事件循环的性能问题 介绍

Javascript 关于异步/等待vs承诺和事件循环的性能问题 介绍,javascript,performance,asynchronous,promise,async-await,Javascript,Performance,Asynchronous,Promise,Async Await,我和我的一位同事一直在讨论浏览器中JavaScript的异步特性,并想知道它的技术优势是什么。我们知道async/await是承诺的语法糖,但很想知道使用其中一个是否还有其他性能优势。例如: 事件循环对async/await和Promission的处理是否相同? 它们都被认为是微任务吗? 使用一个而不是另一个有任何延迟执行的好处吗?例如,承诺执行器中的代码是同步调用的,但是异步函数中的代码又如何呢? 根据MDN,一个异步函数返回一个AsyncFunction对象,但是在Promise文档中没有对

我和我的一位同事一直在讨论浏览器中JavaScript的异步特性,并想知道它的技术优势是什么。我们知道async/await是承诺的语法糖,但很想知道使用其中一个是否还有其他性能优势。例如:

事件循环对async/await和Promission的处理是否相同? 它们都被认为是微任务吗? 使用一个而不是另一个有任何延迟执行的好处吗?例如,承诺执行器中的代码是同步调用的,但是异步函数中的代码又如何呢? 根据MDN,一个异步函数返回一个AsyncFunction对象,但是在Promise文档中没有对它的废弃-AsyncFunction有什么好处? 性能优势是否相同(如果有)? 示例场景 是

被事件循环以同样的方式对待,我的语法可能会有点偏离

工具书类
如果我理解正确,引擎可以优化异步/等待更多。从V8开发人员那里可以看到,尤其是最后的结论:

支持异步函数并等待手写的承诺代码

事件循环对async/await和Promission的处理是否相同

事件循环只是处理事件,我不会说它对待事情完全不同。解析承诺将导致事件推送到循环上,然后循环调用all。然后,在下一个刻度上,处理程序会返回一个承诺并解析它,因为异步函数也会返回一个承诺并解析它,所以您会得到相同的行为

它们都被认为是微任务吗

microtask这个名字是用来解释浏览器的常见行为的,无论是spec还是NodeJS都不使用它,所以我永远不会说xy在JavaScript中是一个microtask。但是,如果调用解析微任务,那么从异步函数返回也是一个微任务,因为它解析了底层承诺

使用一个而不是另一个有任何延迟执行的好处吗?例如,承诺执行器中的代码是同步调用的,但是异步函数中的代码又如何呢

代码始终是同步执行的,JS中的异步性意味着外部事件网络请求、计时器在某个时间到达事件队列,因此通过回调附加到它的代码在某个时间被调用,但它随后在同步管理器中执行

根据MDN,一个异步函数返回一个AsyncFunction对象,但是在Promise文档中没有对它的废弃-AsyncFunction有什么好处

不,它返回一个承诺,异步函数本身就是一个AsyncFunction对象,这意味着它是一个FunctionObject,内部值表示它是异步的

 const asyncFunctionObject = new AsyncFunction("return await stuff();");

 async function functionObject() { return await stuff(); }
性能优势是否相同(如果有)

也许吧。这始终取决于您的具体用例,因此,如果您确实想了解它,请测试性能。但是,如果您看看这两个示例:

 // 1
 a().then(() => b()).then(() => c())

// 2
(async function() {
  await a();
  await b();
  await c();
})();
然后在第一种情况下,如果a、b和c是承诺,那么将有5个承诺。然后。。。返回一个新的承诺,而第二个示例只需要4个异步函数返回的承诺。对于循环来说,比率会变得更好。

等待不是新承诺的等价物,它更类似于承诺。然后。。就它们在事件循环中的运行方式而言,它们应该是相同的、性能方面的,并且使用async/await的优势应该能够更好地优化。最后,在这两种情况下,JSON.parse都不会给您带来任何好处,因为它不是异步的&事实上会减慢速度。假设JSON.parse不是异步的,并且不返回承诺,那么这两个示例同样没有意义。
 const asyncFunctionObject = new AsyncFunction("return await stuff();");

 async function functionObject() { return await stuff(); }
 // 1
 a().then(() => b()).then(() => c())

// 2
(async function() {
  await a();
  await b();
  await c();
})();