节点版本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进一步提高了性能。