Nuxt Content、Nuxt + Comark、Astro、ox-content のドキュメントサイト生成速度を、同一の Markdown corpusで比較するベンチマークです。パーサー単体の速度は対象外です。
- Astro 7.0.9
- Nuxt 4.4.8 / Nuxt Content 3.15.0
- Nuxt 4.4.8 / Comark 0.5.1 /
@comark/nuxt0.5.1 - ox-content Vite plugin 2.76.0 / Vite 8.1.4
バージョンは初回構築時点の最新版に固定しています。更新するときは、全実装を同じ タイミングで更新し、結果にバージョンを記録してください。
@ox-content/vite-plugin@2.76.0 の公開manifestは vite peer dependencyに開発用の
Vite Plus aliasを指定しているため、標準Vite 8.1.4を使うこの構成ではpnpmがpeer warningを
表示します。公開READMEの通常のVite plugin利用方法ではビルドできることを確認済みです。
docs/ 以下に10ディレクトリ、各1,000ファイル、合計10,000個のMarkdownを生成します。
生成処理と依存関係のインストール時間はベンチマークに含みません。
pnpm install
pnpm docs:generatepnpm build:astro
pnpm build:nuxt-comark
pnpm build:nuxt-content
pnpm build:ox-content
pnpm verify
pnpm verify nuxt-comark既定では各実装をランダムな順序で5回ずつクリーンビルドし、中央値をJSONに保存します。 ビルド時間に加え、プロセスツリーを100ms間隔でサンプリングした最大RSSと、成果物の HTML件数・総ファイル数・総バイト数も記録します。
pnpm bench
BENCH_RUNS=10 pnpm bench
pnpm bench astro ox-content
# 直前のビルド出力と内部キャッシュを残したまま再ビルド
BENCH_MODE=warm BENCH_RUNS=1 pnpm bench依存関係キャッシュとOSのファイルキャッシュは保持し、各フレームワークのビルド出力と 内部生成物は実行前に削除します。これは一般的なCIの「依存関係キャッシュあり、ビルド キャッシュなし」に近い条件です。
BENCH_MODE=warm はクリーンアップを行いません。2回目のビルドを測る場合は、先に同じ
corpusと設定でcold buildを完了させ、ソースを変更せずに実行してください。
本番の静的成果物を比較するため、source mapは全実装で明示的に無効化しています。Astroと
ox-contentはViteのbuild.sourcemap: false、Nuxt系はこれに相当するNuxtのserver/client
source mapとNitroのsourceMapをすべてfalseにしています。
nuxt-comarkはNuxt Contentを使用せず、Nitro server routeでMarkdownを直接読み込み、
Comarkで解析したASTをComarkRendererでSSRします。Nuxt Contentと同じ静的HTML設定・
prerender route一覧を使用するため、Nuxt/Nitro共通部分とContent処理の差を比較できます。
Nuxt Contentを大量のMarkdownに使用するときのindex、静的HTML設定、prerender並列度、 Bunプロファイルに関する注意点はNUXT_CONTENT_NOTES.mdにまとめて います。
2026-07-15から16に、全ビルド出力とフレームワーク内部キャッシュを削除したcold build、
その直後に何も削除・変更せず2回目のwarm buildを各1回測定した参考値です。Nuxt Contentは
現在のベンチマーク既定構成であるstatic HTMLとpath indexを使用しています。
正式な比較には、同じ時点で複数回測定した中央値を使用してください。
実行環境:
- Apple M1 Pro(10 logical CPUs)
- 32 GiB RAM
- macOS Darwin 25.5.0
- Node.js 22.22.2
| Implementation | Cold build | 2nd build (warm) | Change | HTML files | Total files | Output size |
|---|---|---|---|---|---|---|
| Astro 7 | 13.58 s | 9.05 s | -33.3% | 10,000 | 10,000 | 39.72 MB |
| ox-content | 13.67 s | 15.17 s | +11.0% | 10,000 | 10,000 | 39.58 MB |
| Nuxt + Comark | 43.08 s | 43.83 s | +1.7% | 10,002 | 10,006 | 51.44 MB |
| Nuxt Content | 82.83 s | 46.46 s | -43.9% | 10,002 | 10,012 | 64.54 MB |
AstroはコンテンツおよびViteキャッシュにより約33%短縮しました。Nuxt ContentはMarkdown 取り込みとSQLite構築を再利用するため約44%短縮します。Comark版は内部コンテンツキャッシュを 持たず毎回Markdownを解析するため、この単発測定ではwarmでの短縮を確認できませんでした。ox-contentは全HTMLを 再生成し、この単発測定ではwarm buildの短縮は確認できませんでした。
Nuxt + Comarkは現在のNuxt Content構成よりcoldで約48.0%、warmで約5.7%短縮しました。 Nuxt Contentの出力にはクライアント用のSQLite/WASMが含まれるため、総ファイル数と出力サイズも 増えています。
現在は最後の行をNuxt Contentベンチマークの既定構成として扱います。各行は設定を一つずつ
加えた単発結果で、Step changeは一つ前の行、vs initialは初期構成との比較です。
| Configuration | Cold build | Step change | vs initial | Warm build | Step change | vs initial | Output size |
|---|---|---|---|---|---|---|---|
| Initial configuration | 288.98 s | — | — | 256.92 s | — | — | 161.75 MB |
| + static HTML | 279.87 s | -3.2% | -3.2% | 248.68 s | -3.2% | -3.2% | 64.53 MB |
+ path index |
81.14 s | -71.0% | -71.9% | 48.62 s | -80.5% | -81.1% | 64.54 MB |
| + source maps disabled (current default) | 82.83 s | +2.1% | -71.3% | 46.46 s | -4.4% | -81.9% | 64.54 MB |
最大の速度改善はpath indexです。static HTML化は速度よりも生成物に効き、出力サイズを
約60.1%削減しました。設定と原因の詳細は
Nuxt Content notesを参照してください。
source map無効化前後の値はいずれも別タイミングの単発測定で、通常buildの明確な速度改善は 確認できませんでした。後述するBun CPU profileからsource map合成処理を除き、本番条件に 揃えることを目的に既定設定へ採用しています。
最大RSSは、測定を実行した管理環境でプロセス一覧の取得が制限されたため記録できて いません。
計測対象には、Markdown探索、frontmatter検証、Markdown変換、ルート生成、HTML出力を 含めます。シンタックスハイライトと目次解析は有効です。検索インデックス、OG画像、 APIドキュメント生成、外部リンク検査は初期ベンチでは対象外です。ox-contentはこれらの 一部が既定で有効なため、設定で明示的に無効化しています。
Nuxt ContentのCPU profileは、Bunでnuxt generate全体を計測するのを基本とします。
pnpm profile:nuxt-content結果はprofiles/nuxt-content-ssg.mdに出力されます。route生成だけを詳しく調べたい場合は、
補助的にpnpm profile:nuxt-prerenderを使用できます。