节点版本8中Async/Await的性能指南

exp*_*rer 10 javascript v8 node.js

async/await可用于节点版本8.代码在nodejs中首次是线性的,本机.那很好.之前很多文章都声称,在v8 javascript引擎中,一个带try/catch块功能没有优化.现在,async/await需要try/catch块来处理错误.那么,作为开发人员需要做些什么才能保持相同的性能?

Sve*_*ven 11

try/catch在提交9aac80fV8 5.3(节点v7.x及以上版本)时收到了TurboFan优化.这意味着try/catch表现不佳的历史性陈述不再适用.
来自V8博文:

在过去,V8很难优化ES2015 +中的语言功能.例如,try/catch/finally为Crankshaft(V8的经典优化编译器)添加异常处理(即)支持永远不可行.这意味着V8能够优化ES6功能for...of,例如基本上具有隐含的finally子句,是有限的.Crankshaft的局限性以及为全代码生成器(V8的基线编译器)添加新语言功能的整体复杂性使得它很难确保在V8中添加和优化新的ES功能,因为它们已经标准化.

幸运的是,Ignition和TurboFan(V8的新解释器和编译器管道)从一开始就被设计为支持整个JavaScript语言,包括高级控制流,异常处理,以及最近for...of和ES2015的解构.Ignition和TurboFan架构的紧密集成使得快速添加新功能和快速增量优化成为可能.


try/catchasync函数中只是对Promise .then.catch方法的合成糖,因此性能由底层的Promise实现决定.Bluebird 声称其性能优于本机Promise实现,因此理论上 - 如果Bluebird声称的是真的 - try/catch通过使用Bluebird的Promise实现覆盖本机Promise实现,您将获得更好的性能.
例如,在Node:中const Promise = require("bluebird"),或global.Promise = require("bluebird")全局覆盖它.

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