本文受到以下文章启发:
2021 年 JavaScript Promise 性能对比一文中,Sukka 大大对 JavaScript Promise 的性能进行了详细的对比。并得出了“Bluebird 依然是速度最快、内存占用最少的 Promise 实现” 这一结论。
本文将在此基础上,对 2025 年 JavaScript Promise 的性能进行对比,看看这几年 Node 原生 Promise 的性能有没有提升?后起之秀 Bun 的 Promise 实现又有怎样的表现?
2024 年,我也曾对比过 JavaScript Promise 的性能:
Benchmark
测试使用的 Benchmark Suite 来自 Sukka 大大基于 v8 团队修改的 Fork 版本:
运行环境为:
1 | OS: Windows_NT 10.0.22631 x64 |
Bluebird vs Native Promise
顺序执行
顺序执行的 Promise 之间存在相互依赖的关系或严格的时序逻辑,无法并行执行。在 doxbee 中使用以下代码来模拟日常开发中的顺序执行:
1 | Promise.all([blobPromise, filePromise]) |
1 | try { |
从图中可以看出,在顺序执行场景下:
- 性能方面:Node.js 24 和 Node.js 25 版本中,Promise BlueBird 和 Async/Await native 性能最优,耗时约在 10-11ms 左右。相比 Node.js 20,性能提升明显(从 17-22ms 降至 10-12ms)。
- 内存占用:Async/Await native 在 Node.js 22 上内存占用最少(0.978 MiB),整体而言原生 Async/Await 的内存占用表现优异。
- Bun 表现:Bun 1.3.1 的 Async/Await native 性能表现不错(18.628ms),但 Promise native 性能相对较差(27.201ms)。
平行执行
平行执行的 Promise 之间不存在相互依赖的关系,可以并行执行。在 doxbee 中使用以下代码来模拟日常开发中的平行执行:
1 | Promise.all(queries) // queries is an array of lots of promises |
1 | try { |
从平行执行的测试结果可以看出:
- 性能方面:Promise BlueBird 在所有版本上都表现出色,耗时仅 8-10ms 左右。Node.js 24/25 的 Async/Await native 性能也有大幅提升(从 40-43ms 降至 17-24ms)。
- 内存占用:Promise BlueBird 的内存占用在 Node.js 24/25 上有所增加(3.5-3.8 MiB),但依然保持较低水平。原生实现在 Node.js 22 之后内存占用显著下降。
- 性能差距:在平行执行场景下,Promise BlueBird 相比原生 Promise 的优势更加明显,速度快约 2-4 倍。
- Bun 表现:Bun 的内存占用表现较好,但 Async/Await native 的性能(47.495ms)略逊于 Node.js 最新版本。
Native Promise vs JavaScript Promise
参与 Benchmark 的 Promise 实现有:
顺序执行
在顺序执行场景下对比各种 Promise 实现:
- Callback 基准:Native Baseline 代表传统 callback 方式的性能基准(3.694ms,0.079 MiB),作为对照参考。
- Bluebird 最优:在所有 Promise 实现中,Bluebird 表现最优(10.687ms,0.797 MiB),性能和内存占用都明显优于其他 Promise 库。
- 其他实现:SPromiseMeSpeed(13.046ms)和 npm-es6-promise-polyfill(12.448ms)表现不错,而 Q.js(28.081ms)和 Zousan(29.916ms)的性能相对较差。
平行执行
在平行执行场景下对比各种 Promise 实现:
- Callback 基准:Native Baseline 代表传统 callback 方式(2.823ms,0.060 MiB),在性能和内存上都是最优的,这是意料之中的结果。
- Bluebird 领先:在所有 Promise 实现中,Bluebird 性能最优(8.171ms,3.586 MiB),速度约为 callback 的 3 倍,但内存占用明显增加。
- 巨大性能差距:不同 Promise 实现之间存在巨大差距,npm-es6-promise 表现最差(228.346ms),比 Bluebird 慢了近 28 倍。
结论
- Bluebird 依然是最快的 Promise 实现:在所有 Promise 库中,Bluebird 无论在性能还是内存占用上都保持领先地位。
- Node.js 原生 Promise 持续优化:Node.js 随着版本更新,原生 Promise 的性能有显著提升。在 Node.js 24/25 版本中,Async/Await native 在顺序执行场景下的表现已经非常接近 Promise BlueBird。
- 平行执行场景差距明显:在平行执行大量 Promise 的场景下,Bluebird 相比原生 Promise 和其他第三方库的优势更加显著,性能可以快 2-4 倍。
- Bun 表现中规中矩:Bun 1.3.1 的 Promise 性能和内存占用与 Node.js 20/22 相似,Async/Await 表现不错,但整体与最新的 Node.js 24/25 相比还有一定差距。
- 使用建议:正如 Bluebird 的 README 中所写:Please use native promises instead if at all possible。对于大多数应用场景,原生 Promise/Async-Await 已经足够好用。但如果你的应用需要处理大量并行 Promise 操作,或者需要 Bluebird 提供的额外 API(如
Promise.map、Promise.props、Promise.each等工具方法),那么 Bluebird 仍然是最优选择。


说些什么吧!