【ITニュース解説】Flight and Scribe on Bun: method, numbers, and where Node still wins
2026年10月16日に「Dev.to」が公開したITニュース「Flight and Scribe on Bun: method, numbers, and where Node still wins」について初心者にもわかりやすく解説しています。
ITニュース概要
JavaScriptランタイムのBunは、Node.jsよりリクエスト処理速度や起動時間が大幅に速いことが示された。既存アプリをBun対応させると、単一コアではNode.jsの3倍以上高速化し、メモリ消費も約8分の1に削減。ただし、複数コアのクラスタ環境ではNode.jsが優位な場合もあり、用途に応じた選択が重要だ。
ITニュース解説
新しいJavaScriptの実行環境であるBunが、既存のNode.jsと比較して大幅な性能向上を示したベンチマーク結果が発表された。特にWebサーバーの応答速度や起動時間において、BunがNode.jsを大きく上回る場面が確認されている。ただし、この性能差がすべての状況で当てはまるわけではなく、テスト方法やアプリケーションの特性によって結果は異なることも示されている。
今回のベンチマークでは、「Flight」と「Scribe」という二つのオープンソースプロジェクトが対象となった。Flightは、VueやReactといったフレームワークで作られたWebアプリケーションを動かすためのサーバーで、Node.jsでWebアプリケーションを構築する際のフレームワークの一つであるKoaをベースにしている。Scribeは、PostgreSQLデータベースとRedisキャッシュを使ってデータを管理するサービスだ。両プロジェクトは、もともとNode.jsで動作していたが、今回Bunに対応したバージョンも用意され、比較が行われた。
ベンチマークの測定は、ある特定のハードウェア環境で行われた。具体的には、8つの仮想CPUと15GBのメモリを搭載した仮想マシン(Debian 13というOSが稼働)を使用し、Node.js 20.19.2、Bun 1.4.2、PostgreSQL 17.11、Redis 8.0.2といったソフトウェアのバージョンが用いられた。テストの公平性を保つため、同じアプリケーションコードのNode.js版とBun版が比較され、計測方法も厳密に定められた。例えば、単一のCPUコアでの性能を測る場合、Webサーバー、データベース、負荷をかけるツール(wrk)それぞれに異なるCPUコアを割り当てるなどの工夫が凝らされた。また、テストは10秒間の準備期間の後、20秒間を3回繰り返して平均値を出すという方法で、安定した結果を得ようとした。プログラムが使うメモリ量(RSS)や、プログラムが起動してから最初の応答を返すまでの時間も計測された。
特に注目すべきは、単一のCPUコアを使った場合の性能だ。Flightプロジェクトでは、Node.js版が1秒あたり約19,651リクエストを処理できたのに対し、Bunネイティブ版は約61,110リクエストを処理し、約3.1倍もの高速化を達成した。Node.jsで書かれたKoaアプリケーションのコードをBunの互換機能で動かした場合でも、約38,826リクエストを処理でき、Node.js版の約2倍の速度が出ている。Scribeプロジェクトでも同様に、データベースからの読み込み処理において、Node.js版が1秒あたり約4,998リクエストだったのに対し、Bun版は約21,349リクエストと、約4.3倍の性能向上を見せた。書き込み処理でも約1.8倍の速度向上があった。 リクエストの遅延(Webサーバーがリクエストを受け取ってから応答を返すまでの時間)も、BunはNode.jsに比べて大幅に短縮されている。例えば、FlightのBunネイティブ版では、リクエストの99%が3ミリ秒以内に完了するのに対し、Node.js版では25ミリ秒かかる場合があった。また、プログラムが使うメモリ量も、Bun版はNode.js版の約8分の1から3.8分の1程度と、非常に効率的だ。プログラムの起動時間に関しても、FlightのNode.js版が1秒以上かかっていたのに対し、Bunネイティブ版はわずか47ミリ秒で起動し、その差は歴然としている。Node.js版の起動が遅い一因には、TypeScriptで書かれたコードをJavaScriptに変換して実行するための仕組み(TypeScriptローダー)の負荷があることも指摘されている。
しかし、Node.jsがまだ強みを発揮する場面も存在する。複数のCPUコアを使うテストでは、Node.jsの「クラスター」という仕組み(複数のワーカープロセスを立ち上げて並列処理を行う方法)を使った場合、Flightの処理速度でBunのシングルプロセスを上回った。具体的には、Node.jsクラスターが1秒あたり約80,740リクエストを処理できたのに対し、Bunのシングルプロセスは最大で約53,835リクエストだった。Scribeプロジェクトの読み込み処理では、Node.jsクラスターとBunの性能はほぼ同等だったが、これはデータベースの処理能力がボトルネックになっている可能性が考えられる。Bunは現在、基本的に一つのプロセスで動作するため、複数のCPUコアを効率的に活用するには、複数のBunプロセスを連携させる「レプリカ」のような仕組みが必要になる。今回のベンチマークでは、このレプリカ構成での比較はまだ行われていない。
このような性能向上がどのように実現されたのかも解説されている。Flightプロジェクトでは、Node.jsでWebアプリケーションを作るフレームワークであるKoaのミドルウェア(Webサーバーがリクエストを受け取ってから応答を返すまでの間に行われる様々な処理)を通さず、BunのネイティブなWebサーバー機能に直接ルート(URLとそれに対応する処理)を登録するようにコードが書き換えられた。これにより、Koaの処理によるオーバーヘッドが削減された。また、既存のKoaコードをそのままBunで動かすための互換レイヤーも提供されており、これによりコードを全て書き換えなくてもNode.js版の約2倍の性能が得られる。さらに、ログ記録やセキュリティヘッダーの追加といったミドルウェア機能も、Koaのパッケージに依存しないBunネイティブな方法で作り直された。BunはTypeScriptのコードを直接実行できるため、Node.jsでは必要だったTypeScriptのビルドステップが不要になり、これも起動時間の短縮に大きく貢献している。
Scribeプロジェクトでは、アプリケーションの核となるロジックと、Webサーバーとしての役割(Expressフレームワークを使っていた部分)が分離された。Bun版では、分離された核となるロジックの上に、BunのWebサーバー機能を使う薄い層を追加する形で実装された。Scribeの書き込み処理の性能向上が読み込み処理ほど大きくなかったのは、書き込み時に毎回データベースの構造を変更する処理(DDL操作)が実行されたり、Redisキャッシュの更新やスキーマのコンパイルがリクエストごとに発生したりするなど、データベース側の処理がボトルネックになっているためだと分析されている。
性能面だけでなく、開発体験の面でもBunは優位性を示している。プロジェクトの依存関係をインストールする時間や、テストを実行する時間がNode.jsのパッケージマネージャー(npm)に比べて圧倒的に速いことが確認された。例えば、Flightプロジェクトの依存関係のインストールでは、npmが約6.11秒かかったのに対し、Bunは約0.44秒で完了し、Scribeプロジェクトのテスト実行時間もnpmが約10.59秒だったのに対し、Bunは約0.87秒と、大幅に短縮されている。これは、開発者がより迅速に作業を進められることを意味する。
今回のベンチマークは非常に詳細だが、まだ測定されていない項目もいくつかある。例えば、Webアプリケーション全体がデータベースと連携して動くような、より複雑な環境でのエンドツーエンドのパフォーマンス、複数のBunプロセスを連携させた場合のNode.jsクラスターとの比較、コンテナ環境での起動時間やメモリ使用量、長時間稼働させた場合のメモリの増加傾向などだ。
Bunは、高いパフォーマンスと開発効率の向上という大きな可能性を秘めている。特に、単一のCPUコアでの処理能力や起動の速さ、メモリ効率の良さは、一部のアプリケーションやサーバーレス環境などで大きなメリットとなるだろう。しかし、現在のところ、マルチコア環境でのフル活用にはNode.jsのクラスター機能が有利な場合もあり、アプリケーションの性質や要求される要件に応じて、どちらの実行環境を選ぶべきか慎重に検討する必要があると言える。今後、Bunのマルチプロセス対応や更なる最適化が進むことで、より幅広い場面で活用されることが期待される。