一尘不染

节点版本8中的异步/等待性能指南

node.js

async/await在节点版本8中可用。该代码本来是在nodejs中第一次线性执行。那很好。早先的许多文章声称,在v8
javascript引擎中,带有try/catchblock
的函数未优化。现在,async/await需要try/catch块来处理错误。那么,作为开发人员,需要做些什么来保持相同的性能?


阅读 200

收藏
2020-07-07

共1个答案

一尘不染

try/catch9aac80f针对V8
5.3(节点v7.x及更高版本)的提交中获得了TurboFan优化。这意味着try/catch具有不良性能的历史性说法不再正确。
V8博客文章

过去,V8难以优化ES2015 +中提供的语言功能。例如,try/catch/finally向V8的经典优化编译器Crankshaft
添加异常处理(即)支持从未变得可行。这意味着V8优化ES6功能(如)的能力for...of受到限制,该功能本质上具有隐式的finally子句。曲轴的局限性以及向V8的基准编译器Full-
codegen中添加新语言功能的整体复杂性,使得固有的难度很难确保在标准化的V8中尽快添加和优化ES新功能。

幸运的是,Ignition和TurboFan(V8的新解释器和编译器管道)从一开始就旨在支持整个JavaScript语言,包括高级控制流,异常处理,以及for...of从ES2015开始的最新结构。Ignition和TurboFan体系结构的紧密集成使快速添加新功能并快速,逐步地优化它们成为可能。


try/catch``async函数中的功能只是Promise
.then.catch方法上的语法糖,因此性能由底层Promise实现决定。蓝鸟声称比本地Promise实现具有更好的性能,因此从理论上讲-
如果蓝鸟声称是正确的-您将try/catch通过用蓝鸟的Promise实现覆盖原生Promise实现来获得更好的性能。
例如,在Node:中const Promise = require("bluebird"),或global.Promise = require("bluebird")全局覆盖它。

但是请注意,这可能会在将来发生变化,因为最初的Promise实现是在JavaScript中实现的,但是最近已在C ++中重新实现,可以在bug
#5343中进行跟踪。

2020-07-07