最近、JavaScript界隈の盛り上がりがすごいですね。
zig
で作られたJavaScriptのランタイムであるbun
は、その便利さ・パフォーマンスの良さから驚くような勢いで広まっています。その一方で新たな軽量WEBフレームワークhono
も非常に注目されています。
hono
もbun
同様にパフォーマンスが良く、エッジサーバーでの実行を想定しているようで非常に軽量です。Cloudflare Workers
を筆頭に、さまざまなランタイム上での動作をサポートしておりbun
も対象です。
話は少し変わりますが、自分はJavaScript(Node.js)でマイクロサービスを作る際はexpress
を脳死で選択してきました。
実行環境はプロジェクトの技術選定の制約がありCloud Run
になることが多いです。しかし、現在となってはbun
にhono
といったexpress
よりも軽量でパフォーマンスが良いとされる素晴らしいものが登場しています。
とはいえ、いきなり本番環境に採用するのは難しいため、今回は1つのエビデンスとなるようにCloud Run
上で動作するexpress
とhono
のパフォーマンスを比較してみたいと思います。合わせてランタイムをbun
にした場合のパフォーマンスも計測します。
cloud runの設定
設定値は変更せずにgcloud run deploy
で設定されるデフォルト値のままです。
ただ、最小インスタンス数は0ではなく1に変更しています。これは可能な限り同じ条件にするために、コールドスタート問題を少しでも回避するためです。今思えば、最大インスタンス数も1で固定したほうが良かったかもしれませんが、これはこれでスケール可能な状態での測定結果ということで自分を納得させました。
サーバーと計測方法について
以下4つの条件でCloud Run
上に文字列を返すだけのシンプルなサーバーを用意しました。
$ curl -X GET http://localhost:8080 Hello Hono! 🔥...
- express
- hono
- bun(express)
- bun(hono)
4つのサーバーに対してwrk
コマンドを使って測定した結果を比較していきます。
本当はwrk2
を使いたかったのですが、自分のMacがM1チップ(Apple Silicon)でwrk2
がM1チップには対応していなかったので、諦めました...。
計測結果
同時コネクション数を10にして10秒間、リクエストを送り続けました。
wrk2
を使うとリクエスト数も固定できるのですが、先ほど書いたようにM1のためお許しください...。
wrk -c10 -d10 --latency https://xxxxxx
全体的な結果を見てみると、明らかなパフォーマンスの差はないようです。
合計リクエスト数に差分がある以上、1秒あたりに捌けたリクエスト数を単純に比較するのは難しいですが、レイテンシーの平均値はexpress
とhono
を比較してみるとhono
の方がリクエスト数が多いにも関わらず僅かに早いようです。
あくまで平均値ではありますが、hono
は標準偏差の値がexpress
よりも小さいためexpress
と比べると安定しているといえます。
bun
を使用することでパフォーマンスが向上するだろうなと予測していましたが、結果は異なりました。
Dockerfileがbun
ランタイムの有無で共通のものではないので、何か違いが生じたのかもしれません。Cloud Run
に関してはbun
ランタイム化するメリットは現時点ではないようでした。
ファイル容量
パフォーマンスとは別に使用したコード(node_modules含む)の容量を見てみます。
容量の確認にはdu
コマンドを使用しました。
- express-server: 6744バイト
- hono-server: 2896バイト
- bun-express: 6656バイト
- bun-hono: 5424バイト
圧倒的にhono
が軽量であることが分かります。
Cloud Run
のようなサーバーレス環境ではデプロイするコードの容量が小さい方が起動時間が短くなる、デプロイ時間が短くなるといったメリットがあります。
まとめ
計測結果とファイル容量の2つの観点から判断するにCloud Run
上であればhono
を選択するのが良さそうです。
今回は明らかなパフォーマンスの違いが計測結果にあらわれませんでしたが、ファイル容量が小さいという点がCloud Run
と相性が良さそうです。
ちなみに今回の計測は無料枠に収まっていたようです。みなさんも実際に計測してみてください。
こうすればbun
ランタイムで高速化できるよ!というtipsをお持ちの方がいれば、教えて頂ければと思います。
少しでも「ええな〜」と思ったらはてなスター・はてなブックマーク・シェアを頂けると励みになります。