节点版本8中的asynchronous/等待性能指导原则

async/await可用于节点版本8.本地代码首次在nodejs中是线性的。 那很好。 早些时候有很多文章声称,在v8 javascript引擎中, try/catch块的function没有被优化。 现在, async/await需要try/catch块来处理错误。 那么,作为一名开发人员,为了保持相同的性能,还需要做些什么呢?

try/catch V8 5.3 (节点v7.x及以上)提交9aac80f TurboFan优化。 这意味着, try/catch的历史性performance不好的performance已经不是真实的。
从V8博客文章 :

过去,V8在优化ES2015 +中的语言function方面遇到了困难。 例如,为Crankshaft,V8的经典优化编译器添加exception处理(即try/catch/finally )支持从未变得可行。 这意味着V8优化ES6function的能力是有限for...of ,这个function基本上有一个隐含的finally子句。 曲轴的局限性以及向全面编码,V8的基准编译器添加新的语言function的整体复杂性使得很难确保在V8中添加和优化新的ESfunction,这与标准化一样快。

幸运的是,Ignition和TurboFan(V8的新解释器和编译器pipe道)从一开始就被devise用来支持整个JavaScript语言,包括先进的控制stream,exception处理以及最近for...of ES2015的解构。 Ignition和TurboFan架构的紧密集成使快速添加新function成为可能,并且可以快速而渐进地对其进行优化。


async函数中try/catch仅仅是Promise .catch.catch方法的.catch糖,因此性能是由底层的Promise实现决定的。 Bluebird 声称比原生的Promise实现有更好的性能,所以理论上 – 如果Bluebird声称是真实的 – 你将通过用Bluebird的Promise实现覆盖原生的Promise实现来获得更好的try/catch性能。
例如,在Node: const Promise = require("bluebird")global.Promise = require("bluebird")中全局覆盖它。

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

我在Node.js v8中发现了原生ES2015承诺和ES2017asynchronousfunction的性能

在Node.js v8中,callbackvs承诺vsasynchronous函数的性能

原生Chrome V8 ES2015承诺和ES2017asynchronous函数的执行速度比Bluebird承诺的要慢大约2倍,使用的内存几乎增加了2倍

结论

Node.js v8具有本地ES2015承诺和ES2017asynchronousfunction的显着改进的性能,通过引入本地util.promisify进一步提高了性能。