async/await
在nodejs 8版本中是可用的,在nodejs中第一次是线性的。太好了。早些时候,许多文章声称,在v8 javascript引擎中,带有try/catch
块的函数不是经过优化的。现在,async/await
需要try/catch
块来处理错误。那么,作为一个开发人员,需要做些什么来保持相同的性能呢?
发布于 2017-09-29 04:39:10
try/catch
在提交9aac80f
for V8 5.3
(Node v7.x
和更高版本)中接收到了TurboFan优化。这意味着,关于try/catch
性能不佳的历史说法已不再正确。
来自V8博客文章
在过去,V8在优化ES2015+中的语言特性时遇到了困难。例如,将异常处理(即
try/catch/finally
)添加到曲轴(V8的经典优化编译器)中是不可行的。这意味着V8优化ES6特性(如for...of
)的能力是有限的,后者本质上有一个隐含的finally子句。曲轴的局限性和向V8的基线编译器全码元添加新的语言特性的总体复杂性,使得确保在V8中以标准化的速度添加和优化新的ES特性具有内在的难度。 幸运的是,Ignition和TurboFan (V8的新解释器和编译器管道)从一开始就被设计为支持整个JavaScript语言,包括高级控制流、异常处理,以及最近的for...of
和ES2015中的析构。点火和TurboFan体系结构的紧密集成使得快速添加新特性并快速、渐进地优化它们成为可能。
try/catch
函数中的async
仅仅是承诺.then
和.catch
方法的语法糖,因此性能取决于底层的允诺实现。蓝鸟索赔要求比本地承诺实现具有更好的性能,所以理论上--如果Bluebird声称的是真的--您将通过使用Bluebird的承诺实现覆盖本机承诺实现来获得更好的try/catch
性能。
例如,在Node:const Promise = require("bluebird")
或global.Promise = require("bluebird")
中全局覆盖它。
但是,请注意,这在将来可能会发生变化,因为最初的承诺实现是在JavaScript中实现的,但是最近在C++中重新实现了,这可以在bug #5343中跟踪。
发布于 2017-09-29 08:26:11
我找到了一个原生ES2015承诺和ES2017异步函数在Node.js v8中的性能
在Node.js v8中回调与承诺与异步函数的性能 本地Chrome V8 ES2015承诺和ES2017异步函数的执行速度都比蓝鸟承诺的内存快2倍。
和
结论 Node.js v8带来了本机ES2015承诺和ES2017异步函数的显着改善性能,这是由于引入了原生util.promisify而进一步提高了性能。
https://stackoverflow.com/questions/46481709
复制相似问题