blog.euxn.me

nodejs v8/v7 のPromise とBluebird Promise を雑にベンチ比較した

2017-06-08 Thu.

既存の Bluebird Promise を利用しているコードから Bluebird を消すべきなのか悩むことがあって調べたところ、 ES6 の Promise は Bluebird の4倍遅いらしいと言う情報を見つけたのですが、 node.js v8.0 も出たことなので、ベンチを取りました。

ベンチマーク環境

マシンは Macbook Pro Retina 15 inch Late 2013 (2.3 GHz Intel Core i7) です。

雑ですが以下のコードでベンチマークを実施します。

promise-benchmark.js
1// const Promise = require('bluebird');
2
3let cntr = 0;
4const myPromise = () => {
5 return new Promise((resolve, reject) => {
6 cntr++;
7 if (cntr === 1000000) reject();
8 resolve();
9 }).then(myPromise)
10};
11
12const startedAt = Date.now();
13myPromise().catch(() => console.log(Date.now() - startedAt));

各種 10 回ずつ実行し、最大と最小を除いた値で比較します。単位は ms。 以下のワンライナーでベンチを実行しました。(ワンライナーとは……)

1for i in `seq 1 10`;do;node promise-benchmark.js;done | sort | head -n 9 | tail -n 8 \
2| tee >(awk '{if(max<$1) max=$1} END {print "max: " max}') \
3| tee >(awk '{if(min == 0 || min>$1) min=$1} END {print "min: " min}') \
4| tee >(awk '{m+=$1} END {print "average: " m/NR}') \
5| tee >(ruby -e 'elms = STDIN.map{|i|i.to_i}; puts "median: #{elms.size % 2 == 0 ? elms[elms.size/2-1, 2].inject(:+) / 2.0 : elms[emls.size/2]}"')

結果

| 項目 | 最大値 | 最小値 | 平均値 | 中央値 | | -------------------- | ------ | ------ | ------- | ------ | | ES6 Promise(v7.10.0) | 5481 | 5354 | 5399.75 | 5394.5 | | ES6 Promise(v8.0.0) | 1619 | 1568 | 1591.12 | 1588.0 | | Bluebird(v7.10.0) | 898 | 836 | 862 | 353.5 | | Bluebird(v8.0.0) | 448 | 417 | 433.875 | 435.5 |

node v7 では v8 や bluebird と比べても極端に遅いことが分かります。それと比べると v8 ではだいぶ性能向上したと言えるでしょう。 とはいえ、どちらの場合においても Bluebird の方が性能が出ています。現状でも約 3.7 倍程度の性能差があるようです。

結論

node v8 の Promise よりも Bluebird Promise の方が速い

余談

tee って順序保障されないんですね

Other Works
2024-12-01 Sun.
OpenAPI Spec を出力できる DSL、TypeSpec の実践例
- ドワンゴ教育サービス開発者ブログ

2024-11-16 Sat.
型付き API リクエストを実現するいくつかの手法とその選択
- TSKaigi Kansai 2024

2024-09-10 Tue.
corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
- Zenn

2024-09-10 Tue.
言語環境の管理は *env や *vm を超えて、 mise へ
- Zenn

2024-06-28 Fri.
TypeSpec を使い倒してる
- Kyoto.js 22

2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024

2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ

2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn

2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ

2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn

2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn

2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn

2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn

2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn

2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn

2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn

2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn