Node.js / Deno / Bun 比較検証 計画書

📅 作成: 2026-08-24 / 更新: 2026-08-26 主軸: Node.js 26.7.0 / Deno 2.9.5 / Bun 1.4.0

この文書について

JavaScript / TypeScript ランタイムである Node.jsDenoBun の 3 者を、 それぞれの最新バージョンで実際に動かして比較するための計画書です。何を測り、どう測り、どう判断するかを事前に決めておくことで、 「速そう」「新しそう」といった印象ではなく再現可能な数値と事実に基づいて選定できる状態を作ります。

目次

  1. 目的とゴール
  2. 比較対象バージョンと検証環境
  3. 比較の観点(評価軸)
  4. 検証項目とベンチマーク設計
  5. 実施手順とディレクトリ構成
  6. 成果物と評価方法
  7. スケジュールとリスク

目的とゴール

背景

Node.js は 2009 年から続くデファクトスタンダードで、npm エコシステムと LTS による長期運用が最大の武器です。 Deno は同じ作者による「Node.js の設計をやり直す」試みとして始まり、2.x 以降は npm 互換を取り込んで実務投入しやすくなりました。 Bun は Zig + JavaScriptCore による実装で、起動速度・実行速度とオールインワンのツールチェーンを前面に出しています。 3 者は今や「どれを選んでも一応動く」段階に入っており、だからこそ用途ごとの向き不向きを自分の手元で確かめる価値があります。

この検証のゴール

  1. 定量データ — 起動時間・HTTP スループット・ファイル I/O・JSON 処理などを同一マシン・同一条件で計測し、数値を表とグラフで残す。
  2. 定性評価 — TypeScript の扱い、標準搭載ツール、npm 互換性、エラーメッセージの分かりやすさ、Windows での挙動を実際に触って記録する。
  3. 選定指針 — 「CLI ツールを作る」「API サーバを常駐させる」「スクリプトを 1 本書く」といった用途別に、どれを選ぶべきかの判断マトリクスを作る。
  4. 再現性 — 計測スクリプトと生ログを残し、半年後に新しいバージョンで同じ検証を回せる状態にする。

スコープ外

比較の前提として明示すること:単一マシンでの測定値はハードウェア・電源プラン・常駐プロセスの影響を強く受けます。 絶対値を「このランタイムは毎秒 N リクエスト処理できる」と一般化はせず、同一条件下での 相対比 としてのみ扱います。

比較対象バージョンと検証環境

最新バージョン(2026-08-24 時点)

各プロジェクトの公式配布情報から取得した最新版です。Node.js は Current 系列と LTS 系列の 2 本を対象に含めます。

ランタイム系列バージョンリリース日備考
Node.jsCurrentv26.7.02026-08-05主軸26.0.0 は 2026-05-05。2026 年 10 月に LTS 化予定の系列。レポートの Node.js 代表値はこの版とする
Node.jsActive LTSv24.19.02026-08-03参考コードネーム Krypton。26 系との世代差を見るための比較対象
Node.jsMaintenance LTSv22.23.22026-07-28対象外コードネーム Jod。今回は測らない
Denostablev2.9.52026-08-06TypeScript をそのまま実行。ツールチェーン内蔵
Bunstablev1.4.02026-08-203 者の中で最も新しいリリース

手元環境の現状とギャップ

検証マシンに現在入っているバージョンを実測した結果です。着手前にこのギャップを埋めます。

ランタイムインストール済み目標状態対応
Node.jsv25.8.2v26.7.0 / v24.19.0 要更新 25 系は奇数系列のため LTS 化されず、最終リリースは v25.9.0(2026-03-31)。26 と 24 を並行導入する
Deno1.31.1v2.9.5 大幅に古い 1.x → 2.x はメジャー移行で API と権限モデルが変わっている。deno upgrade で入れ替える
Bun1.4.0v1.4.0 最新 対応不要。計測直前に bun upgrade で再確認するだけ
npm11.11.1Node 同梱版 Node に追従 Node 更新に伴い同梱版へ切り替わる。パッケージ管理比較の基準として記録しておく

バージョン切り替えの方針

Node.js は複数系列を測るためバージョンマネージャを使い、Deno / Bun は自前のアップグレードコマンドで単一の最新版に固定します。

対象方法コマンド例
Node.js 複数系列fnm または nvm-windows で切り替えfnm install 26.7.0 / fnm use 26.7.0
Deno本体のアップグレード機能deno upgrade(バージョン指定は --version 2.9.5
Bun本体のアップグレード機能bun upgrade
全体計測直前に版数を記録node -v / deno -V / bun -v の出力をログ先頭に保存

3 ランタイムの立ち位置

Node.js 26 / 24 エコシステム最大・実績最多 V8 + libuv / CommonJS + ESM LTS による長期サポート TS は別途トランスパイル前提 パッケージ管理は npm / pnpm Deno 2.9 権限をデフォルトで拒否 TypeScript をそのまま実行 Web 標準 API 志向 test / fmt / lint / doc を内蔵 npm: 指定で npm も利用可 Bun 1.4 速度と起動時間を最優先 Zig + JavaScriptCore Node API 互換を強く志向 bundler / test / runner 一体 package.json をそのまま解釈

検証環境の記録項目

結果の再現に必要な情報を、計測結果と同じ場所に必ず残します。

比較の観点(評価軸)

評価軸の一覧

「速さ」だけで選ぶと運用で詰まるため、性能と非機能要件の両方に重み付けをします。重みは合計 100 とし、集計時のスコア算出に使います。

#評価軸測る内容重み判定方法
1起動性能プロセス起動から終了までの時間、依存を読み込んだ場合の増分15定量
2実行性能HTTP スループット、JSON 処理、ファイル I/O、計算処理20定量
3npm 互換性実務でよく使うパッケージが無修正で動くか15定量(成功率)
4TypeScript設定なしで .ts が動くか、型チェックの扱い、型解決の速度10定性+定量
5ツールチェーンtest / fmt / lint / bundle / 単一実行ファイル化の内蔵状況10定性
6パッケージ管理クリーンインストール時間、キャッシュ有効時の時間、lock ファイル互換10定量
7運用・サポートLTS の有無とサポート期間、セキュリティ修正の頻度10定性
8開発体験エラーメッセージの読みやすさ、watch / hot reload、デバッガ接続5定性
9Windows 対応パス処理・改行・シンボリックリンク・権限まわりの落とし穴5定性

定性評価のスコア基準

定性項目は主観が入るため、5 段階の意味を先に固定してから触ります。

スコア意味
5標準機能だけで完結し、設定ファイルも追加インストールも不要
4標準機能で足りるが、既定値の変更や短い設定が必要
3公式が案内する追加パッケージ・追加ツールを入れれば実現できる
2サードパーティ製に依存し、組み合わせの検証が必要
1実現手段が無い、または回避策が実務に耐えない
重みは着手前に確定させる:結果を見てから重みを動かすと、望んだ結論に合わせて配点を調整することになります。 重みの変更が必要になった場合は、変更前後の両方のスコアを併記して記録します。

検証項目とベンチマーク設計

定量計測の項目

ID項目内容指標測定ツール
B-01空スクリプト起動console.log("x") のみのファイルを実行ms(中央値)hyperfine
B-02依存込み起動実用的な依存を数個 import した状態で起動ms(中央値)hyperfine
B-03HTTP スループット各ランタイムの標準 API で最小の "Hello" サーバを立てるreq/s、p99 レイテンシoha
B-04JSON 処理10 MB の JSON を parse → 変換 → stringifyms、ピークメモリ自作スクリプト
B-05ファイル I/O小ファイル 2000 件の書き込み・読み込み・一覧・削除(当初 1 万件から縮小。下の注記を参照)ms自作スクリプト
B-06CPU バウンド処理文字列処理と数値計算のループ(V8 と JSC の差を見る)ms自作スクリプト
B-07SQLite組み込み SQLite への一括 INSERT と SELECTms自作スクリプト
B-08依存インストール同一 package.json をキャッシュ有/無でインストール秒、node_modules サイズ計測スクリプト
B-09TypeScript 実行同一の .ts ファイルを設定なしで実行できるか、その所要時間ms、可否hyperfine
B-10単一実行ファイル化1 ファイルの CLI を実行ファイルに固める秒、出力サイズ、可否計測スクリプト
B-11テスト実行同一のテスト 200 件を各ランタイムのテストランナーで実行計測スクリプト

npm 互換性チェックの対象

「動く/動かない」を切り分けたいので、性質の異なるパッケージを意図的に混ぜます。ネイティブアドオンを含むものは特に差が出やすい部分です。

分類確認したいこと
純 JS ライブラリ日付処理・バリデーション系ESM / CJS 両形式の解決が問題なく通るか
HTTP フレームワークExpress 系(Node API 依存が濃いもの)node:http 互換レイヤの完成度
ネイティブアドオン画像処理・暗号系など N-API を使うものビルド/ロードが通るか、プリビルドが効くか
DB ドライバPostgreSQL クライアントソケット周りの API 互換性
CLI ツールbin エントリを持つパッケージnpx 相当の実行経路が機能するか
ビルドツールバンドラ・トランスパイラワーカースレッド・子プロセスを使う処理が動くか

公平に測るためのルール

  1. 同一のソースを使う — ランタイム固有 API(Deno.serveBun.serve)を使う版と、共通の node:http 版の両方を測り、別々に記録する。片方だけを取り上げて有利/不利を言わない。
  2. ウォームアップを行う — JIT が温まる前の値を混ぜない。hyperfine は --warmup 3 以上を指定する。
  3. 試行回数と統計値 — 各項目 10 回以上実行し、平均ではなく中央値を代表値にする。最小・最大・標準偏差も併記する。
  4. プロセスは毎回作り直す — キャッシュ状態が持ち越されないよう、計測ごとにサーバを再起動する。
  5. 1 項目ずつ直列に実行 — 並列実行すると CPU とディスクを取り合って結果が濁る。
  6. 失敗も結果として残す — 動かなかった項目は空欄にせず、エラー内容とともに記録する。互換性の比較ではこれ自体が重要なデータになる。
B-05 の件数を 2000 件に縮小した:予備計測で 1 ファイルあたり約 3.7 ms かかることが分かり、1 万件では 1 回の試行に約 46 秒、 4 ランタイム × 10 回で 30 分を超える計算になりました。Windows のファイル単位オーバーヘッド(ウイルス対策のリアルタイムスキャン込み)が 支配的で、件数を増やしても比較の分解能は上がりません。件数は BENCH_FILE_COUNT で変更でき、記録にも残します。
マイクロベンチの限界:B-03 の「Hello を返すだけのサーバ」で出る差は、実アプリでは DB アクセスやテンプレート描画に埋もれてほぼ消えます。 この検証では B-03 の数値をそのまま実アプリの性能予測に使わず、「ランタイム層のオーバーヘッドの上限を測るもの」として扱います。

実施手順とディレクトリ構成

実施フロー

1. 環境整備 3 ランタイムを最新化 2. 実装 計測用コードを用意 3. 予備計測 ばらつきを確認 4. 本計測 全項目を直列実行 5. 集計 レポート作成 ばらつきが大きい項目は条件を見直して再計測

ステップの詳細

ステップ作業内容完了条件
1. 環境整備 Node.js 26 / 24 の導入と切り替え確認、Deno を 2.9.5 へ更新、Bun の版数確認、計測ツール(hyperfine・oha)の導入、電源プランの固定 版数一覧を results/env.txt に出力できる
2. 実装 ベンチ項目 B-01〜B-11 のコードを、共通版とランタイム固有版に分けて作成。計測を回すドライバスクリプトも用意 全項目が 1 回ずつエラーなく通る(数値の妥当性は次段階)
3. 予備計測 各項目を 3 回だけ回し、ばらつき(標準偏差)と所要時間を把握。異常に揺れる項目は条件を見直す 各項目の変動係数が許容範囲に収まる、または原因が特定できている
4. 本計測 全項目を規定回数で直列実行。生ログを JSON / CSV で保存。並行して定性評価の記録も取る results/raw/ に全項目のログが揃う
5. 集計 中央値の算出、スコア化、グラフ生成、レポート HTML の作成、用途別の判断マトリクスの作成 docs/report/ にレポートが生成され、結論が書かれている

ディレクトリ構成

20260824-node-deno-bun-compare/
├── README.*                     プロジェクト概要(この計画書へのリンク)
├── docs/
│   ├── plan/
│   │   └── comparison-plan.*    この計画書
│   └── report/                  結果レポート(ステップ 5 で生成)
├── bench/
│   ├── common/                  3 ランタイム共通のソース(node: API のみ使用)
│   │   ├── b01-startup.js
│   │   ├── b03-http.js
│   │   └── ...
│   ├── native/                  ランタイム固有 API 版
│   │   ├── deno/
│   │   └── bun/
│   ├── compat/                  npm 互換性チェック用のプロジェクト
│   └── fixtures/                テストデータ(大きい JSON 等。生成スクリプトで作る)
├── src/scripts/                 番号付きフォルダ。各 .ps1 に同名の .cmd ランチャーを併置
│   ├── 10_setup_runtimes/       ランタイムの導入・配置
│   ├── 20_run_bench/            本計測ドライバ
│   ├── 30_run_install_bench/    依存インストールと npm 互換性
│   ├── 40_run_compile_bench/    単一実行ファイル化
│   ├── 50_build_report/         集計
│   └── 70_html2md/              HTML から Markdown を生成
├── results/
│   ├── env.txt                  検証環境と版数の記録
│   └── raw/                     生ログ(コミット対象)
├── etc/                         セッションログ・補助スクリプト(git 管理外)
└── tmp/                         一時ファイル(git 管理外)
fixtures はコミットしない:10 MB の JSON や 1 万件のファイルはリポジトリに入れず、生成スクリプトと乱数シードだけを残します。 同じシードから同じデータを作れれば再現性は保てます。

成果物と評価方法

成果物

成果物形式内容
結果レポートHTML全項目の数値表、グラフ、定性評価、用途別の推奨と根拠
集計データCSV項目 × ランタイムの中央値・最小・最大・標準偏差
生ログJSON / テキストhyperfine・oha の出力そのまま。再集計できる状態で保存
計測スクリプトJS / TS / PS1同じ手順を後日再実行するための一式
互換性メモHTML動かなかったパッケージとエラー内容、回避策の有無

スコアの出し方

  1. 定量項目は、各項目でもっとも良い値を 100 とした相対スコアに正規化する(時間系は「最小値 ÷ 実測値 × 100」)。
  2. 定性項目は 5 段階スコアを 20 倍して 100 点満点に揃える。
  3. 評価軸ごとに配下の項目スコアを平均し、章 3 の重みを掛けて合計する。
  4. 総合スコアは順位付けの補助として示すだけにし、結論は用途別の判断マトリクスで述べる。

用途別 判断マトリクス(記入テンプレート)

最終的にこの表を埋めることが、この検証のアウトプットの本体です。 記入済みの表は 結果レポート の章 1 にあります。以下は計画時のテンプレートです。

用途重視する評価軸推奨根拠
長期運用する業務 API サーバ運用・サポート、npm 互換性
社内向け CLI ツール起動性能、単一実行ファイル化
使い捨てのスクリプト・自動化起動性能、TypeScript、権限管理
フロントエンドのビルド基盤ツールチェーン、パッケージ管理
既存 Node.js プロジェクトの高速化npm 互換性、実行性能
外部コードを実行するサンドボックス用途権限管理、運用・サポート

スケジュールとリスク

フェーズと想定工数

フェーズ作業想定工数主な成果物
P1環境整備・ツール導入0.5 日results/env.txtsetup-runtimes.ps1
P2ベンチコード実装2 日bench/ 一式
P3npm 互換性チェック1 日互換性メモ
P4予備計測・条件調整0.5 日調整記録
P5本計測1 日results/raw/
P6集計・レポート作成1.5 日docs/report/
6.5 日

リスクと対策

リスク影響対策
検証中に新バージョンがリリースされる(Bun は特に更新が速い) 着手時点の版数を固定し、途中で上げない。差分が気になる場合は再計測を別回として記録する
計測値のばらつきが大きく差が判定できない 試行回数を増やす、常駐プロセスを止める、標準偏差を必ず併記して「差なし」と言える範囲を明示する
Deno 1.x → 2.x の移行で既存の検証コードが動かない Deno のコードは 2.x 前提で新規に書く。1.x 時代の記憶に頼らず公式のマイグレーション情報を確認する
ネイティブアドオンが Windows でビルドできない ビルドツールチェーンの有無を前提条件として記録し、失敗も比較結果として残す
ランタイム固有 API と共通 API を混ぜて不公平な比較になる 章 4 のルールどおり両方測り、表で列を分けて示す
工数が膨らんで結論が出ないまま終わる B-01〜B-05 と npm 互換性を必須、それ以外は任意扱いにして、必須分だけで結論が書ける構成にする

決定事項

項目決定決定日
Node.js の主軸バージョンNode.js 26.7.0(Current) を主軸とし、レポートの Node.js 代表値もこの版とする。24.19.0(LTS)は世代差を見る参考値として併記する2026-08-25
Maintenance LTS(22)の扱い今回は測らない。工数を主軸の精度に振る2026-08-25
ランタイムの導入先システムには入れず、プロジェクト内 tools/ 配下に隔離配置する。計測ツール(hyperfine・oha)も同じ扱い。既存のグローバル環境は変更しない2026-08-25
計測時の電源設定AC 接続かつ電源モード「最大パフォーマンス」で計測する。この機種には powercfg の「高パフォーマンス」プランが存在しないため、設定アプリの電源モード(オーバーレイ)で制御する2026-08-25

未決事項