Node.js / Deno / Bun 比較検証 結果レポート

Node.js 26.12.1 / Deno 2.9.8 / Bun 1.4.4 / 計測 11 項目・各 10 回試行

📅 作成: 2026-08-25 / 更新: 2026-10-25

あわせて読む: 検証計画書

要約

Windows 11 の同一マシン上で、3 ランタイムの最新版を tools/ 配下に隔離配置し、11 項目のベンチマークと npm 互換性チェックを実施しました。 Bun 1.4.4 が総合スコア 84.8 点で最上位、Deno 2.9.8 が 66.0 点、Node.js 26.12.1 が 61.9 点でした。 ただしこの順位は「速さ」の重みが大きい配点によるもので、用途を絞ると結論は変わります。 npm 互換性は 8 パッケージすべてが 3 ランタイムで動作し、差がつきませんでした。 一方で LTS による長期サポートは Node.js だけが持っています。

目次

  1. 結論 — 用途別の推奨
  2. 検証条件と方法
  3. 起動性能とプロセス単位の速さ
  4. 実行性能
  5. パッケージ管理と npm 互換性
  6. ツールチェーンと配布
  7. 総合スコアと読み方の注意

結論 — 用途別の推奨

計画書で用意した判断マトリクスを、実測値で埋めた結果です。総合スコアではなくこの表が本レポートの結論です。

用途推奨根拠(実測値)
長期運用する業務 API サーバ Node.js 26 LTS 制度を持つのは Node.js だけで、26 系は 2026-10 に LTS 化予定。SQLite は最速(181.2 ms 対 Deno 314.1 ms)。HTTP の共通コード(node:http)では Bun に 1 割強譲るが、Deno の 1.47 倍(31,895 req/s)。
社内向け CLI ツール Bun 起動 20.1 ms(Node 50.8 ms の 2.5 倍速)。実行ファイル化は 0.7 秒で完了。出力サイズを最優先するなら Deno(76.7 MB 対 Bun 109.9 MB)。
使い捨てのスクリプト・自動化 Bun 起動・TypeScript 実行(61.3 ms)ともに最速で、書いてすぐ回す用途に効く。3 者とも設定なしで .ts が動いた。
フロントエンドのビルド基盤 Bun テスト実行 46.7 ms(Node の 4.0 倍速)、バンドルとテストが本体に同梱。CI でキャッシュを効かせるのが主眼なら Deno(キャッシュ有インストール 0.9 秒)。
既存 Node.js プロジェクトの高速化 Bun npm パッケージ 8/8 が無修正で動作。CPU 処理 2.08 倍、テスト 4.03 倍、起動 2.53 倍、node:http のサーバも 1.12 倍速い。ただし SQLite は Node が速く(Bun は 1.13 倍遅い)、置き換えで遅くなる処理もある。
外部コードを実行するサンドボックス用途 Deno 権限が既定で拒否される唯一のランタイム。今回のスクリプトはすべて -A を明示しないと動かなかった。ファイル・ネットワーク・環境変数の粒度で許可を絞れる。

3 行でまとめると

2026 年時点で「npm が動かない」は理由にならない:ネイティブアドオン(sharp・bcrypt)を含む 8 パッケージが、 3 ランタイムすべてで import から利用まで通りました。かつて Deno・Bun を避ける最大の理由だった互換性は、この検証範囲では判断材料になりません。

検証条件と方法

検証環境

項目内容
OSWindows 11 Home(build 26300)
CPUIntel Core i7-11370H @ 3.30GHz(4 物理コア / 8 論理)
メモリ31.8 GB
計測日2026-10-25
ストレージNVMe KIOXIA KXG60ZNV1T02
電源AC 接続・電源モード「最大パフォーマンス」(この機種に powercfg の高パフォーマンスプランは存在しない)
計測ツールhyperfine 1.20.0(プロセス単位)/ oha 1.16.0(HTTP 負荷)
2026-08-25 の初回計測とは数値を比べられません:初回は build 26200・メモリ 15.8 GB で測りました。CPU と電源の条件は同じですが、 OS とメモリの構成が変わったため、ほぼすべての項目が 1.5〜2 倍速く出ています。この差はランタイムの版の差ではありません。 このレポートの数値は、すべて 2026-10-25 に同じ条件で測り直したものです。
B-03(HTTP)の値は回ごとに大きく動く:同じマシン・同じ構成で測った 2026-10-10 の回(ランタイムは 1 つ前の版)と比べると、 B-03 は 6 通りすべてが 20〜40% 高く出ました。B-03 は負荷試験を 1 回だけ行う項目のため、回ごとの揺れを均せません。 順位も入れ替わります(共通コードの最速は、前回は Node.js 26、今回は Bun)。B-03 の順位は、この 1 回の結果として読んでください。

検証対象

ランタイムバージョン位置づけ
Node.js26.12.1主軸Current 系列。レポートの Node.js 代表値
Node.js24.22.1参考Active LTS (Krypton)。26 系との世代差を見るため併記
Deno2.9.8主軸
Bun1.4.4主軸

3 ランタイムはいずれもシステムにインストールせず、公式配布物をプロジェクト内 tools/ に展開して明示パスで呼び出しました。 Node.js と Deno は公式の SHA256 と一致することを確認済みです。システムにインストールされているランタイムは使っていません。

公平に測るために守ったこと

計画から変えた点

項目変更内容と理由
B-05 の件数 1 万件 → 2000 件。1 ファイルあたり約 3.7 ms かかり、1 万件では 4 ランタイム × 10 回で 30 分を超えるため。Windows のファイル単位オーバーヘッドが支配的で、件数を増やしても分解能は上がりません。
B-03 の試行 他項目のような 10 回反復ではなく、10 秒 × 50 接続の負荷試験を 1 回。この項目の指標は req/s であり、負荷試験の内部で十分な回数のリクエストが発生するためです。したがって B-03 には標準偏差がありません。
Node.js 22 対象外にしました。工数を主軸(26 系)の精度に回す判断です。
互換性の見本 ネイティブアドオンの見本を better-sqlite3 から bcrypt 6.0.0 に替えました。better-sqlite3 を版の指定なしで入れると、ビルド済みバイナリがまだ無い新しい版を引き、手元でのビルドに回って失敗したためです。bcrypt は Node-API で書かれ、バイナリを npm パッケージに同梱しているので、Node.js の版を上げても同じことは起きません。版も固定しました。依存の総量が減ったため、B-08 の数値は初回と比べられません。
計測コードの拡張子 12 本のうち 10 本を .mjs で書いています。TypeScript を優先する取り決めとは外れますが、計測済みの数値を守るためにそのままにしました。.ts に変えると型ストリップの処理が起動時に入り、B-01・B-02・B-09 の値がここに載っているものと変わります。拡張子を揃えるなら 11 項目すべてを測り直す必要があります。

起動性能とプロセス単位の速さ

プロセスを起動して終わるまでの時間を hyperfine で測った項目です。CLI ツールや使い捨てスクリプトでは、この時間がそのまま体感になります。

中央値 (ms) — 短いほど速い ■ 青=Node.js 26 ■ 水色=Deno ■ 緑=Bun B-01 空スクリプト起動 50.8 57.7 20.1 B-02 依存込み起動 117.7 134.7 38.9 B-09 TypeScript 実行 147.0 107.1 61.3 B-11 テスト 200 件 188.2 136.7 46.7
項目Node.js 26DenoBunNode.js 24(参考)最速比
B-01 空スクリプト起動50.8 ms57.7 ms20.1 ms48.1 msBun が 2.53 倍速
B-02 依存込み起動117.7 ms134.7 ms38.9 ms117.3 msBun が 3.02 倍速
B-09 TypeScript 実行147.0 ms107.1 ms61.3 ms141.2 msBun が 2.40 倍速
B-11 テスト 200 件188.2 ms136.7 ms46.7 ms204.1 msBun が 4.03 倍速

読み取れること

この差が効く場面は限られる:数十 ms の差はプロセスを何度も起こす使い方(CLI・pre-commit フック・CI の細かいステップ・ファイル監視での再実行)でしか体感になりません。 常駐するサーバでは起動は 1 回だけなので、この章の結果はサーバ選定の根拠になりません。

実行性能

B-03 HTTP スループット

10 秒間・50 同時接続で "Hello" を返し続けたときの毎秒リクエスト数です。共通の node:http 版と、各ランタイム固有 API 版を分けて測りました。

req/s — 長いほど速い Node.js 26 node:http 31,895 Deno node:http 21,698 Bun node:http 35,643 Deno Deno.serve 46,378 Bun Bun.serve 40,239 点線の下はランタイム固有 API 版(共通コードではない)
サーバ実装req/sp50 遅延p99 遅延備考
Node.js 26 / node:http31,8951.53 ms3.27 msBun に 1.12 倍の差で 2 位
Node.js 24 / node:http26,4871.80 ms4.04 ms参考値。26 が 1.20 倍速い
Deno / node:http21,6982.18 ms4.92 ms互換レイヤ経由
Bun / node:http35,6431.36 ms2.66 ms共通コードでの最速
Deno / Deno.serve46,3781.06 ms2.03 ms固有 API。共通版の 2.14 倍
Bun / Bun.serve40,2391.22 ms2.33 ms固有 API。共通版の 1.13 倍

固有 API を使うかどうかで結論が変わります。 node:http のままなら Bun が最速で、Node.js 26 が 1.12 倍の差で続き、Deno は Node.js 26 より 3 割ほど遅れます。固有 API まで許すと Deno が最速になり、Bun を 15.3% 上回りました(p99 遅延も Deno が 0.3 ms 短い)。 注目すべきは Deno の伸び幅で、互換レイヤを捨てると 2.14 倍になりました。Deno の node:http は互換のためのラッパで、性能を出す経路ではないことがはっきり出ています。

B-04 JSON 処理(10 MB / 52,481 レコード)

ランタイム合計parse変換stringifyheap 使用量
Node.js 2680.1 ms57.4 ms9.5 ms11.6 ms41.8 MB
Node.js 2484.3 ms59.9 ms8.3 ms16.8 ms61.7 MB
Deno84.6 ms55.9 ms16.7 ms10.8 ms60.3 MB
Bun62.2 ms38.0 ms12.2 ms10.4 ms39.0 MB

合計では Bun が最速で、Node.js 26 の 1.29 倍です。差の大半は JSON.parse(Bun 38.0 ms 対 Node.js 26 57.4 ms)から来ています。 メモリ使用量は Bun(39.0 MB)と Node.js 26(41.8 MB)が小さく、Node.js 24・Deno は 60 MB 台でした。Node.js 24 → 26 で heap が 61.7 MB → 41.8 MB に減っているのは、 この検証で見えた 26 系の明確な改善点です。

B-05 ファイル I/O(2000 ファイルの書き込み・読み込み・一覧・削除)

ランタイム合計書き込み読み込み一覧削除
Node.js 262,535.8 ms1,883.1 ms210.6 ms1.2 ms414.9 ms
Node.js 242,001.4 ms1,511.1 ms172.0 ms1.2 ms308.7 ms
Deno2,243.8 ms1,642.6 ms209.5 ms4.7 ms381.4 ms
Bun1,991.6 ms1,489.3 ms171.9 ms1.0 ms334.7 ms

この項目はランタイムの差より揺れの方が大きく出ます。 合計の最速は Bun ですが、Node.js 24 との差は 0.5% しかありません。 最遅の Node.js 26 は 1.27 倍遅く出ましたが、変動係数が 17.6% と大きく(10 回の幅は 1,790〜3,266 ms)、ほかの 3 者は 5〜10% でした。 1 ファイルあたり約 1 ms を Windows のファイル操作コストが占めており、Node.js 26 の遅れがランタイムの性質かどうかは、この 1 回の計測からは決められません。

B-06 CPU バウンド処理

ランタイム合計数値ループ文字列処理配列ソート
Node.js 26724.7 ms60.7 ms63.3 ms592.2 ms
Node.js 24646.3 ms56.8 ms62.7 ms519.5 ms
Deno636.1 ms54.9 ms57.8 ms521.7 ms
Bun348.3 ms53.3 ms38.8 ms249.6 ms

合計 2.08 倍(対 Node.js 26)という Bun の優位は、ほぼ配列ソートの 1 点から来ています(249.6 ms 対 Node.js 26 592.2 ms)。 100 万要素の Array.prototype.sort で JavaScriptCore が V8 の 2 倍以上速く、これが合計の差を作っています。 数値ループは 4 者とも 53〜61 ms で、差は 15% 以内でした。「Bun は CPU 処理が全般に速い」と一般化すると誤ります。 なお Node.js 26 はソートで 24 より 14% 遅く、この項目では 4 者の最下位でした。

B-07 SQLite(インメモリ・10 万行)

ランタイム合計一括 INSERT集計クエリ点参照 2 万回
Node.js 26181.2 ms138.5 ms21.7 ms20.7 ms
Node.js 24198.7 ms148.8 ms25.3 ms24.7 ms
Deno314.1 ms252.3 ms33.5 ms31.5 ms
Bun205.5 ms164.6 ms27.0 ms13.3 ms

Node.js 26 が合計で最速です。 3 ランタイムすべてが node:sqlite を持っており、同じコードが無修正で動きました。 Bun は点参照で最速ながら合計では 1.13 倍の差で 2 位、Deno は INSERT で Node.js 26 の 1.82 倍遅く、合計でも 1.73 倍遅れました。DB アクセスが中心のワークロードでは、起動やソートの速さが結論を決めないことが分かります。

「Hello を返すだけ」の数値を実アプリに持ち込まない:B-03 の 21,698〜46,378 req/s は、リクエスト 1 件あたり 22〜46 マイクロ秒の差です。 実際の API では B-07 の SQLite アクセス(点参照 1 回あたり 0.7〜1.6 マイクロ秒 × 件数)やネットワーク待ちが支配的になり、 ランタイム層の差は埋もれます。B-03 は「ランタイムのオーバーヘッドの上限」を測ったものと読んでください。

パッケージ管理と npm 互換性

B-08 依存インストール

性質を混ぜた 8 パッケージ(純 JS 2・HTTP フレームワーク・DB ドライバ・ビルドツール・CLI・ネイティブアドオン 2)を、 同一の package.json から各パッケージマネージャでインストールした時間です。

コマンドクリーンキャッシュ有node_moduleslock ファイルpostinstall スクリプト
npm install16.8 秒8.4 秒 2,285 件 / 51.4 MBpackage-lock.json既定で実行
deno install7.7 秒0.9 秒 2,380 件 / 51.4 MBdeno.lock--allow-scripts で明示許可
bun install12.4 秒6.7 秒 2,278 件 / 51.4 MBbun.lock既定でブロック(trustedDependencies が必要)

キャッシュが効いたときの差が極端です。 deno install の 0.9 秒に対し bun install は 6.7 秒、npm install は 8.4 秒。 Deno はグローバルキャッシュから node_modules を組み立て直すだけで済む設計になっており、この条件では 7〜10 倍の差がつきました。 一方クリーン(キャッシュもロックも無い)状態では 7.7〜16.8 秒に収まり、ネットワーク待ちが支配的になって差は 2.2 倍まで縮みます。

生成される node_modules はどれも 51.4 MB・2,300 件前後でほぼ同じでした。 bun install が postinstall を既定でブロックしても完走したのは、今回の対象のネイティブアドオンがバイナリを配る方式だったためです。 sharp は OS ごとの別パッケージを optionalDependencies で、bcrypt はパッケージへの同梱で配っています。ソースからのビルドが必要なパッケージでは結果が変わります。

P3 npm 互換性チェック

各パッケージマネージャが作った node_modules に対し、対応するランタイムで import と主要エクスポートの存在確認を行いました。

パッケージ分類Node.js 26Node.js 24DenoBun
zod純 JS ライブラリOKOKOKOK
dayjs純 JS ライブラリOKOKOKOK
expressHTTP フレームワークOKOKOKOK
pgDB ドライバOKOKOKOK
esbuildビルドツール(ネイティブバイナリ同梱)OKOKOKOK
prettierCLI ツール(bin エントリあり)OKOKOKOK
sharpネイティブアドオン(プリビルド配布)OKOKOKOK
bcryptネイティブアドオン(Node-API・同梱バイナリ)OKOKOKOK
成功率—8/88/88/88/8
この結果は「8 パッケージについて」の話:全滅も想定して失敗を残す作りにしていましたが、 結果は全勝で差がつきませんでした。npm には 300 万を超えるパッケージがあり、8 個で「互換性は完全」とは言えません。 特にソースからのネイティブビルドを要求するパッケージ、Node.js の内部 API に触るパッケージは今回の対象に含まれていません。 自分のプロジェクトの package.json でこのチェックをやり直すのが、最も確実な確認方法です。

ツールチェーンと配布

B-10 単一実行ファイル化

依存を持たない 1 ファイルの CLI を、実行ファイルに固めた結果です。生成物は実際に起動して期待した出力が出ることを確認しています。

ランタイム方法所要時間出力サイズ動作手順の重さ
Bunbun build --compile0.7 秒109.9 MB OK1 コマンド
Denodeno compile9.6 秒76.7 MB OK1 コマンド
Node.js 26SEA(--experimental-sea-config + postject)14.4 秒100.6 MB OK3 段階。postject を npm から取得する必要あり

3 者すべて動く実行ファイルを作れましたが、手数が違います。Bun と Deno は 1 コマンドで完結、Node.js は blob 生成 → node.exe の複製 → postject による注入の 3 段階で、しかも postject を npm から入れる必要があります。 14.4 秒のうち大半はこの npm インストールです。出力サイズは Deno が最小(76.7 MB)、Bun が最大(109.9 MB)でした。

前回(Deno 2.9.7・Bun 1.4.3)と比べて動いた値が 2 つあります。deno compile は 2.0 秒から 9.6 秒に延び、Bun の出力は 91.9 MB から 109.9 MB に増えました。 どちらも原因は確かめていません。Deno は版を上げた直後の 1 回目の計測なので、実行ファイルの土台をダウンロードする時間が入った可能性があります(未確認)。

この項目で 1 度失敗し、原因は検証側にあった:Node.js SEA は最初の実行で npm error Tracker "idealTree" already exists で失敗しました。作業ディレクトリに package.json を置いていなかったため npm が親ディレクトリを探索したことが原因で、Node.js の制約ではありません。package.json を置いて再実行し成功しています。 計測harnessの不備をランタイムの欠点として記録しないよう、失敗はすべて原因を切り分けました。

標準で持っているもの

機能Node.js 26Deno 2.9.8Bun 1.4.4
TypeScript の直接実行あり(型ストリップ・消去可能構文のみ)あり(型チェックも可)あり
テストランナーあり(node --test)あり(deno test)あり(bun test)
node:test 記法の実行200/200 パス200/200 パス200/200 パス
フォーマッタ / リンタなしあり(deno fmt / deno lint)あり(bun fmt)
バンドラなしあり(deno bundle)あり(bun build)
単一実行ファイル化あり(要 postject)ありあり
SQLiteあり(node:sqlite)あり(node:sqlite)あり(node:sqlite / bun:sqlite)
権限モデルなし(全許可)あり(既定で拒否)なし(全許可)
LTS による長期サポートありなしなし

Deno の権限モデルは今回の検証で実際に体感しました。-A(全許可)を付けないと、 ファイル読み込み・環境変数参照・ポート待ち受けのいずれもエラーになります。手間ではありますが、 外部から持ち込んだスクリプトを走らせる場面ではこの既定拒否が他 2 者に無い価値になります。

総合スコアと読み方の注意

評価軸ごとのスコア

定量項目は「各項目の最良値を 100 とした相対値」を軸内で平均、定性項目は 5 段階を 100 点満点に換算した値です。重みは計画時に確定させたものを変更していません。

スコア(100 点満点。各軸の重みを括弧内に併記) ■ 青=Node.js 26 ■ 水色=Deno ■ 緑=Bun 起動性能 (15) 36.4 31.8 100.0 実行性能 (20) 78.8 67.1 97.6 npm 互換性 (15) 100.0 100.0 100.0 TypeScript (10) 41.7 57.3 100.0 ツールチェーン (10) 14.8 20.7 100.0 パッケージ管理 (10) 10.3 100.0 13.1 運用・サポート (10) 100.0 60.0 40.0 開発体験 (5) 80.0 100.0 100.0 Windows 対応 (5) 100.0 80.0 100.0 起動性能・実行性能・npm 互換性・TypeScript・ツールチェーン・パッケージ管理は定量、残り 3 軸は定性評価

総合スコア

ランタイム総合スコア最も強い軸最も弱い軸
Bun 1.4.484.8起動性能・実行性能・TypeScript・ツールチェーン(すべて 100 前後)パッケージ管理 13.1/運用・サポート 40.0
Deno 2.9.866.0パッケージ管理 100.0/開発体験 100.0ツールチェーン 20.7/起動性能 31.8
Node.js 26.12.161.9運用・サポート 100.0/Windows 対応 100.0/実行性能 78.8パッケージ管理 10.3/ツールチェーン 14.8
Node.js 24.22.1(参考)63.026 系とほぼ同じ26 系とほぼ同じ(ツールチェーンは 22.9。下の注意 3 を参照)

この総合スコアを信用しすぎないための注意

  1. 相対スコアは差を誇張する — 最良値を 100 とする方式なので、実測差が小さくてもスコア差は開きません/逆に開きすぎます。 典型はパッケージ管理で、キャッシュ有インストールが Deno 0.9 秒・Bun 6.7 秒・npm 8.4 秒なので、Bun は 13.1 点、Node.js は 10.3 点という壊滅的な数字になります。 実際には「7〜8 秒か 1 秒か」であって、日常の開発を左右する差ではありません。逆にファイル I/O では、Node.js 26 の 1 回の揺れ(変動係数 17.6%)がそのまま 79 点という点差になります。
  2. 重みが結論を決めている — 速さ関連(起動 15+実行 20+TypeScript 10)で 45 点を占める配点なので、Bun が勝つのは配点の帰結でもあります。 ほかの重みをそのままにして「運用・サポート」を 10 から 49 以上に上げると、Node.js が最上位になります。重みは計測後に動かしていませんが、自分の状況に合わせて再計算する前提の数字です。
  3. ツールチェーン軸が B-10・B-11 の時間だけで決まっている — fmt / lint / bundle の有無という本来この軸で重要な要素は、 定量化できていないため章 6 の表に分離してあります。スコア 14.8 は「Node.js のツールチェーンが弱い」ことの証拠としては不十分です。 また B-10 は Node.js 26 でしか測っていないため、Node.js 24 は B-11 だけで点が付き、22.9 点と 26 系より高く出ます。参考の Node.js 24 が総合で 26 系を上回るのは、主にこのためです。
  4. 単一マシン・単一 OS の相対比較 — 4 コアのノート PC 1 台、Windows のみ。絶対値を「このランタイムは毎秒 N リクエスト処理できる」と一般化はできません。 変動係数は多くの項目で 5〜15% あり、10% 以内の差は「差なし」として扱うべきです。
  5. HTTP は固有 API では Deno が最速 — 実行性能の軸には共通コード(node:http)のみを入れています。 固有 API を使う前提なら Deno の実行性能スコアは上がります。

再現方法

同じ計測を後日やり直せます。tools/ のバイナリと src/bench/fixtures/ のテストデータはリポジトリに含めず、スクリプトから再生成します。

# Windows PowerShell 5.1・pwsh 7 のどちらでも動く
# 1. ランタイムと計測ツールを tools/ に配置(SHA256 検証つき)
src/scripts/10_setup_runtimes/setup-runtimes.ps1

# 2. ベンチ本体(項目を分けて実行し、-Append で結果をマージできる)
src/scripts/20_run_bench/run-bench.ps1 -Runs 10 -Warmup 3 -Only B-01,B-02,B-09,B-11
src/scripts/20_run_bench/run-bench.ps1 -Runs 10 -Warmup 3 -FileCount 2000 -Only B-04,B-05,B-06,B-07 -Append
src/scripts/20_run_bench/run-bench.ps1 -Only B-03 -HttpSeconds 10 -HttpConnections 50 -Append

# 3. 依存インストールと npm 互換性
src/scripts/30_run_install_bench/run-install-bench.ps1

# 4. 単一実行ファイル化
src/scripts/40_run_compile_bench/run-compile-bench.ps1

# 5. 集計(定性評価は docs/results/qualitative.json を読む)
src/scripts/50_build_report/build-report.ps1
成果物内容
docs/results/env.txt検証環境・版数・バイナリの SHA256
docs/results/measurements.csv項目 × ランタイムの中央値・最小・最大・標準偏差・変動係数
docs/results/summary.json相対スコア・評価軸スコア・総合スコアを含む集計結果
docs/results/qualitative.json定性評価のスコアと、その根拠にした実測値
docs/results/raw/hyperfine・oha の生出力、インストールログ、互換性チェックの生結果