本文受到以下文章启发:
2021 年 JavaScript Promise 性能对比一文中,Sukka 大大对 JavaScript Promise 的性能进行了详细的对比。并得出了“Bluebird 依然是速度最快、内存占用最少的 Promise 实现” 这一结论。
本文将在此基础上,对 2024 年 JavaScript Promise 的性能进行对比,看看这几年 Node 原生 Promise 的性能有没有提升?后起之秀 Bun 的 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 { |
从图中可以看出,Promise BlueBird 在顺序执行时性能和内存占用都优于 Promise native,而 Async/Await Bluebird 在性能和内存上都逊于 Async/Await Native。总体而言,顺序执行时原生的 Async/Await 最优。
平行执行
平行执行的 Promise 之间不存在相互依赖的关系,可以并行执行。在 doxbee 中使用以下代码来模拟日常开发中的平行执行:
1 | Promise.all(queries) // queries is an array of lots of promises |
1 | try { |
和顺序执行类似,Promise BlueBird 在平行执行时性能和内存占用都优于 Promise native,速度快了 4 倍,内存占用少了 7 倍(不过 Bun 上的差距没有这么大)。而 Async/Await Bluebird 在性能和内存上都逊于 Async/Await Native(除了Bun)。总体而言,如果你使用的是 Promise,那么 BlueBird 更优,但如果你使用的是 Async/Await,那么原生的 Async/Await 更优秀。
Native Promise vs JavaScript Promise
参与 Benchmark 的 Promise 实现有:
顺序执行
Bluebird 不论是在性能还是内存占用上都是最优。
平行执行
Bluebird 依然是最优秀的 Promise 实现。
结论
- Bluebird 依然是速度最快、内存占用最少的 Javascript Promise 实现。
- Node.js 随着版本的更新,原生 Promise 的性能有所提升,但还是和 Bluebird 有一定差距。但 Async/Await 的性能和内存占用已经优于 Bluebird。
- Bun 的 Promise 和 Node.js 22 性能相近。
- 正如同 Bluebird 的 README 中所写: Please use native promises instead if at all possible 如今,原生 Promise 已经足够好用了。但如果你需要使用 Promise Polyfill,或是需要 Bluebird 提供的额外 API,那么 Bluebird 仍然是最优选择。