ES6 promises 与 Bluebird

861 阅读2分钟

译者:kayson

原文链接

我对 node 的异步特性非常着迷。作为一门“单线程模型”语言,Node 工程师们必须高效地处理异步问题。我想简单讨论的话题是 ES6 内置的 promise 和 Bluebird(一个处理异步问题的库) 之间的性能比较。我惊讶地发现,Bluebird 的性能比 ES6 promise 好很多。我所说的好很多,是指它的 promise 完成得更快,同时占用更少的内存。

你肯定会对自己说,世界上怎么会有一个库的性能比 ES6 的 promise 快那么多? 其实你只要深入了解 ES6,你会发现 ES6 依赖 V8 引擎来实现 promise。作为开始,我想给你们展示一个代码片段,看看 V8 的本地代码是如何启动一个 promise 的。

function PromiseInit(promise){
   return PromiseSet(
      promise, 0, UNDEFINED, new InternalArray, new InternalArray)
}

根据这个函数,它在初始化 promise 的时候,创建了2个数组。如此创建的每个 promise,占用了大量的不必要的空间。Bluebird 初始化 promise 时不依赖 V8 引擎,克服了初始化 promise 创建不必要的数组的问题。

Bluebird 之所以比 ES6 promise 性能更快和更高效的另一个原因是,你可以“promise化”。一般来讲,promise 化允许用户创建自己的 promise。fs 就是个例子。在处理 node 中的 fs 模块的时候你肯定会碰到异步问题。

var fs = Promise.promisifyAll(require('fs'));

上面这段代码会让你使用 fs 的 promise 版本,而不是每次使用它的时候初始化一个新的 promise。这个 promise 化的特性极大地优化了你的代码。你会发现它不仅占用更少的内存,你的 promise 也会更快地被解决(resolve)。

我相信尽管现在 Bluebird 可能更快、更高效,一旦 ES6 promise 被完整实现,并且 V8 引擎得到优化, ES6 promise 会赶上 Bluebird 的性能的。这是个很大的期待,如果 V8 优化了 promise 的话。但在此之前,用 Bluebird 吧。