async/await
可用于节点版本8.代码在nodejs中首次是线性的,本机。那很好。之前许多文章声称,在v8 javascript引擎中,try/catch
块的函数未经优化。现在,async/await
需要try/catch
个块来处理错误。那么,作为开发人员需要做些什么才能保持相同的性能呢?
答案 0 :(得分:10)
try/catch
在V8 5.3
(节点v7.x
及更高版本)的提交9aac80f
中收到了TurboFan优化。这意味着try/catch
表现不佳的历史性陈述不再适用
来自V8 blog post:
在过去,V8很难优化ES2015 +中的语言功能。例如,向Crankshaft(V8的经典优化编译器)添加异常处理(即
try/catch/finally
)支持是不可行的。这意味着V8优化ES6功能(如for...of
,基本上具有隐含的finally子句)的能力有限。 Crankshaft的局限性以及为全代码生成器(V8的基线编译器)添加新语言功能的整体复杂性使得它很难确保在V8中添加和优化新的ES功能,因为它们的标准化速度很快。幸运的是,Ignition和TurboFan(V8的新解释器和编译器管道)旨在从一开始就支持整个JavaScript语言,包括高级控制流,异常处理,以及最近的
for...of
和ES2015的解构。 Ignition和TurboFan架构的紧密集成使得快速添加新功能并快速增量地优化它们成为可能。
try/catch
函数中的 async
只是Promise .then
和.catch
方法的合成糖,因此性能由底层的Promise实现决定。 Bluebird claims具有比本机Promise实现更好的性能,因此理论上 - 如果Bluebird声称的是真的 - 通过使用Bluebird覆盖本机Promise实现,您将获得更好的try/catch
性能承诺实施。
例如,在节点:const Promise = require("bluebird")
或global.Promise = require("bluebird")
中全局覆盖它。
但是请注意,这可能会在将来发生变化,因为最初的Promise实现是在JavaScript中,但最近已在C ++中重新实现,因为可以在bug #5343中进行跟踪。
答案 1 :(得分:3)
我找到了Performance of native ES2015 promises and ES2017 async functions in Node.js v8
Node.js v8中回调与承诺与异步函数的性能
原生Chrome V8 ES2015承诺和ES2017异步功能 使用近2个,比Bluebird承诺的速度大约慢2倍 更多的记忆
和
<强>结论强>
Node.js v8具有显着改进的原生性能 ES2015承诺和ES2017异步功能,进一步提升了 介绍本地util.promisify。