async/await在节点版本8中可用。该代码本来是在nodejs中第一次线性执行。那很好。早先的许多文章声称,在v8 javascript引擎中,带有try/catchblock 的函数未优化。现在,async/await需要try/catch块来处理错误。那么,作为开发人员,需要做些什么来保持相同的性能?
async/await
try/catch
try/catch在9aac80f针对V8 5.3(节点v7.x及更高版本)的提交中获得了TurboFan优化。这意味着try/catch具有不良性能的历史性说法不再正确。 从V8博客文章:
9aac80f
5.3
v7.x
过去,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体系结构的紧密集成使快速添加新功能并快速,逐步地优化它们成为可能。
过去,V8难以优化ES2015 +中提供的语言功能。例如,try/catch/finally向V8的经典优化编译器Crankshaft 添加异常处理(即)支持从未变得可行。这意味着V8优化ES6功能(如)的能力for...of受到限制,该功能本质上具有隐式的finally子句。曲轴的局限性以及向V8的基准编译器Full- codegen中添加新语言功能的整体复杂性,使得固有的难度很难确保在标准化的V8中尽快添加和优化ES新功能。
try/catch/finally
for...of
幸运的是,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")全局覆盖它。
try/catch``async
.then
.catch
const Promise = require("bluebird")
global.Promise = require("bluebird")
但是请注意,这可能会在将来发生变化,因为最初的Promise实现是在JavaScript中实现的,但是最近已在C ++中重新实现,可以在bug #5343中进行跟踪。