React SSR のパフォーマンスをベンチマークする方法
コンテンツ検証、ロード、p95 レイテンシー、応答ごとの CPU、メモリおよびブラウザーのチェックを備えた、再現可能な React SSR ベンチマークを構築します。
PRNext 0.1.18-alpha が利用可能です。このリリースに伴い、開発候補を使用して 10 月 29 に取得された測定値を公開します。小規模な VPS では、CPU 時間とメモリがリクエスト速度と同じくらい重要です。このコードを 2 台の Linux マシン上の Next.js と比較し、リソースを制約して、ワークロードに応じて結果がどのように変化するかを確認しました。
PRNext 候補は、2 CPU の予算で、100-row SSR ページで 57% 高いスループットを実現します。小規模な VPS では、同じページで応答ごとに約 37% が使用され、CPU が減り、RAM が多くなります。これらの結果を総合すると、この比較の目的が説明されています。つまり、PRNext がどこで役立つか、コストはどれくらいか、Next.js の方が優れている部分を明らかにします。
2 つの CPU と 1 GiB を使用すると、候補者は 100-row SSR ページで 142.97 と比較して 1 秒あたり 224.70 応答に達し、約 57% 高いスループットになります。同じ予算の 1,000-row ページでは、Next.js がリードしています。両方の VPS マシンで Next.js を使用すると、水分補給の測定も高速化されます。
小規模な VPS では、通常の SSR CPU のコストは約 37% 下がりますが、PRNext はより多くのメモリを使用します。ワーカーがスリープすると、目覚めが遅くなる代わりに RAM が解放されます。次のセクションでは、各シナリオのバージョン、測定値、制限事項について説明します。
10 月の 29, 2026 の測定では、コミット 2856155. で 0.1.18-alpha 開発候補が使用されています。そのマニフェストには依然として内部バージョン 0.1.17-alpha が含まれていますが、そのコードと最適化は npm 0.1.17-alpha パッケージとは異なります。正確に測定されたソース ハッシュとアーティファクト ハッシュは、この記事の最後にリンクされています。
参照は、同じ React 19.3.1 ファミリとアプリケーション ソースを使用する Next.js 16.4.3, です。小規模 VPS は Node.js 22.23.4 を実行します。大きなマシンでは Node.js 24.22.1. が実行されます。各マシン内では、すべてのエンジンがまったく同じノード実行可能ファイルを使用します。ノードも変更されるため、マシン間の違いはハードウェアのみに起因するものではありません。
PRNext は、Balanced プロファイルとそのデフォルトの Web レンダラーを実行します。関連データには、完全な Linux バイナリと候補パッケージのハッシュ、修正前の結果、およびスループット範囲が含まれます。 10 月 30 に公開された npm 0.1.18-alpha リリースは、コミット 05a9ccd から来ており、追加のビルドおよび開発修正が含まれています。したがって、このキャンペーンでは、npm 0.1.17-alpha パッケージも最終的な 0.1.18-alpha アーカイブも測定されません。数値は、その後の変更に新しいベンチマークを割り当てることなく、特定された候補を表します。
最初の VPS には 1 つの vCPU と約 1.9 GiB または RAM があります。 2 番目には 8 つの vCPU と約 23 GiB があります。ターゲット プロセスは、スワップなしで cgroup v2 CPU とメモリ制限を受け取ります。小型マシンは CPU と 700 MiB のうち 1 つの 70% に限定されます。大型マシンは 1 つの CPU と 384 MiB、2 つの CPU と 1 GiB、次に 4 つの CPU と 2 GiB でテストされます。
メイン マトリックスには、96 ウィンドウ (4 つの予算、4 つのシナリオ、3 つのバリアント、および 2 つの交互パス) が含まれています。バリアントは、修正前の PRNext、測定された PRNext 候補、および Next.js です。各ウィンドウには 5 秒間のウォームアップがあり、その後 16 個の接続と gzip を使用して 15 秒間測定されます。表では、候補と Next.js を比較し、各メトリックの 2 つのウィンドウの中央値を報告します。
シナリオは、動的な 100-row SSR ページ、1,000-row ページ、16 エントリの JSON API、および 40 ms サスペンス遅延のあるページです。新しい識別子と Cookie により、応答の正確性と分離性がチェックされます。スループットは、成功した検証済みの応答のみをカウントします。これは、CDN から提供される静的ページの比較ではありません。
p95 は、リクエストの 95% がウィンドウ内で終了するまでの期間です。 CPU は、遅延ではなく、成功した応答ごとの CPU 作業のミリ秒です。 RAM は、ネイティブ エンジンとノード ワーカーを含むターゲット プロセス ツリー全体の比例セット サイズ (PSS) の中央値です。応答には 100 ms かかる場合がありますが、CPU は数ミリ秒しか使用しません。
ロード ジェネレーターには個別の制限がありますが、小規模 VPS の単一の物理 CPU を共有します。高速 API シナリオは、特に小型マシンや 4 つの CPU シナリオでは上限に達する可能性があります。既存のサービスはアクティブなままです。クォータによってこれらの VPS 上の競合が解消されるわけではありません。 2 つの短いパスでは信頼区間は得られません。小さな違いがマーケティング上の約束になってはいけません。
0.7 CPU および 700 MiB では、PRNext は Next.js の 51. に対して 1 秒あたり 81.33 SSR の応答を提供します。その p95 は 420.90 ms に対する 264.25 ms です。 CPU のコストは応答あたり 13.39 から 8.46 ms に減少し、約 37% 減少します。ただし、メモリは 101.38 MiB に対して 113.88 MiB です。このページでは、PRNext が約 12% を使用します。
ストリーミングは、80.03, に対して 1 秒あたり 138.13 リクエストに達し、応答あたり 42% 少ない CPU になります。重いページは、1 秒あたりのリクエスト数が 10.33 であるのに対して 11.33 で、はるかに近いです。このキャンペーンでは API が PRNext に有利ですが、同じ物理的な CPU に対するジェネレーターの競合が依然として制限となっています。
小さな画面では、表を水平にスクロールします。
| シナリオ/エンジン | 要求/秒 | p95 (ミリ秒) | CPU (ミリ秒/要求) | RAM (MiB) |
|---|---|---|---|---|
| SSR 100 / PRNext | 81.33 | 264.25 | 8.46 | 113.88 |
| SSR 100 / Next.js | 51.00 | 420.90 | 13.39 | 101.38 |
| SSR 1 000 / PRNext | 11.33 | 1,550.25 | 58.92 | 139.51 |
| SSR 1 000 / Next.js | 10.33 | 1,661.80 | 62.10 | 119.46 |
| API JSON / PRNext | 518.17 | 61.40 | 1.27 | 139.63 |
| API JSON / Next.js | 352.80 | 90.05 | 1.94 | 113.08 |
| 40 ms ストリーミング / PRNext | 138.13 | 182.65 | 4.98 | 135.32 |
| 40 ms ストリーミング / Next.js | 80.03 | 307.25 | 8.62 | 115.54 |
このマシン上の 4 つのシナリオすべてで、PRNext は Next.js よりも多くの PSS を使用します。観察された利点は主に、通常の SSR およびストリーミングでの CPU の効率です。 RAM が低いという包括的な主張は、これらの結果を誤って伝えることになります。
1 つの CPU と 384 MiB に制限された大規模な VPS では、SSR ページは 59.90. に対して 1 秒あたり 99.77 リクエストに達します。CPU のコストは約 41% 低く、PSS は約 13% 低くなります。ストリーミングは、1 秒あたり 86.27 リクエストに対して 220.90 に達し、応答あたり 11.47 ms または CPU に対して 4.51 を使用します。
候補者のより厳しいメモリ ポリシーにより、以前の PRNext コードと比較して RAM も減少しますが、API はその以前のコードに対して約 13% のスループットを失います。この測定では、PRNext が依然として Next.js をリードしています。それは内部回帰を消去するものではありません。ガベージ コレクションとスループットのバランスを保つには、さらなる作業が必要です。
小さな画面では、表を水平にスクロールします。
| シナリオ/エンジン | 要求/秒 | p95 (ミリ秒) | CPU (ミリ秒/要求) | RAM (MiB) |
|---|---|---|---|---|
| SSR 100 / PRNext | 99.77 | 227.20 | 9.90 | 109.85 |
| SSR 100 / Next.js | 59.90 | 365.35 | 16.78 | 126.50 |
| SSR 1 000 / PRNext | 13.60 | 1,329.65 | 72.82 | 139.97 |
| SSR 1 000 / Next.js | 10.00 | 1,932.90 | 95.47 | 158.74 |
| API JSON / PRNext | 849.63 | 38.75 | 1.18 | 128.40 |
| API JSON / Next.js | 409.13 | 76.85 | 2.45 | 163.78 |
| 40 ms ストリーミング / PRNext | 220.90 | 108.50 | 4.51 | 140.27 |
| 40 ms ストリーミング / Next.js | 86.27 | 299.30 | 11.47 | 167.14 |
2 つの CPU と 1 GiB を使用すると、100-row SSR ページは、Next.js の 142.97 に対して、PRNext では 1 秒あたり 224.70 リクエストに達します。つまり、スループットが 57% 増加し、応答あたりのスループットが 26% 減少し、CPU 減少し、PSS が 32% 減少します。 p95 は 154.60 ms に対する 89.80 ms です。
1,000-row ページでは、結果が逆転します。Next.js は、PRNext の 24, に対して、740.80 ms に対して 622.20 ms の p95 で、1 秒あたり 27.63 リクエストに達します。 PRNext は、応答ごとに RAM を少なくしますが、約 29% 多くの CPU を使用します。重い React レンダリングは依然として具体的な改善目標です。
小さな画面では、表を水平にスクロールします。
| シナリオ/エンジン | 要求/秒 | p95 (ミリ秒) | CPU (ミリ秒/要求) | RAM (MiB) |
|---|---|---|---|---|
| SSR 100 / PRNext | 224.70 | 89.75 | 7.57 | 117.50 |
| SSR 100 / Next.js | 142.97 | 154.55 | 10.29 | 173.30 |
| SSR 1 000 / PRNext | 24.00 | 740.75 | 64.42 | 164.17 |
| SSR 1 000 / Next.js | 27.63 | 622.25 | 49.91 | 198.96 |
| API JSON / PRNext | 2,078.33 | 14.00 | 0.83 | 144.80 |
| API JSON / Next.js | 1,001.40 | 28.25 | 1.22 | 203.93 |
| 40 ms ストリーミング / PRNext | 341.00 | 55.15 | 4.40 | 154.70 |
| 40 ms ストリーミング / Next.js | 218.67 | 105.00 | 6.31 | 206.20 |
ストリーミングでは、応答ごとに約 56% 多いスループットが維持され、約 30% 少ない CPU が減ります。これらの結果は、すべての React プロジェクトではなく、この動的なアプリケーション、プロファイル、予算に適用されます。
4 つの CPU と 2 GiB では、PRNext は 2 つのワーカーを使用します。 Next.js は、プライベート ノード プロキシの背後で 2 つのプロセスを使用します。そのプロセスには、CPU と RAM が含まれます。他の 3 つの予算では、直接サーバーを使用します。このトポロジの違いは結果の一部です。
この Next.js 参照について、PRNext は 247.13 に対して 1 秒あたり 383.30 SSR リクエストに達します。その PSS は 458.33 MiB に対する 206.60 MiB です。これでは、普遍的な 55% RAM 保存が確立されません。別のトポロジまたはプロキシでは結果が変わる可能性があります。 API は発電機の天井に届くこともあります。
小さな画面では、表を水平にスクロールします。
| シナリオ/エンジン | 要求/秒 | p95 (ミリ秒) | CPU (ミリ秒/要求) | RAM (MiB) |
|---|---|---|---|---|
| SSR 100 / PRNext | 383.30 | 56.35 | 8.49 | 206.60 |
| SSR 100 / Next.js | 247.13 | 133.50 | 11.80 | 458.33 |
| SSR 1 000 / PRNext | 46.37 | 450.10 | 68.28 | 272.22 |
| SSR 1 000 / Next.js | 45.50 | 688.85 | 62.55 | 520.04 |
| API JSON / PRNext | 3,421.17 | 8.20 | 0.91 | 242.97 |
| API JSON / Next.js | 1,582.60 | 24.05 | 1.90 | 525.35 |
| 40 ms ストリーミング / PRNext | 356.90 | 48.45 | 5.09 | 262.35 |
| 40 ms ストリーミング / Next.js | 313.77 | 68.75 | 7.98 | 542.40 |
この予算では、候補者は以前の PRNext コードと比較して、SSR スループットの約 10% を失い、重いページでは約 6% を失います。 CPU を増やしても、すべてのパスが改善されるとは限りません。ワーカー全体のスケーリングと高負荷のレンダリング割り当てにはまだ作業が必要です。
トラフィックの少ないサイトでは、一日中プロセッサーが飽和状態になることはありません。アイドル状態のメモリは、ピーク スループットよりも重要な場合があります。 PRNext は、Rust サーバーをリッスンし続けながら、アイドル期間の経過後にノード ワーカーをリタイヤさせることができます。次のレンダリング リクエストでは、必要なワーカーが再作成されます。
このメカニズムを、単純な SSR ページと加速された 2 秒のアイドルしきい値を使用して小規模 VPS でテストしました。従業員が退職した後に記憶が観察されますが、これには約 2 秒かかりました。保温コントロールは約 6 秒待ちます。これは、負荷テストや耐久テストとは別に、設定ごとに 1 つの機能プローブです。
小さな画面では、表を水平にスクロールします。
| PRNext 設定 | 静かにしてください RAM (MiB) | ウェイクリクエスト (ミリ秒) |
|---|---|---|
| アイドル労働者の退職 | 10.5 | 1,130.0 |
| プレウォーム後のアイドルリタイア | 10.4 | 1,126.6 |
| 予熱と保温 | 106.8 | 22.6 |
このプローブでは、PSS は、保温時の 106.8 MiB に対して、従業員の退職後は約 10.5 MiB に低下します。コストはスリープ解除リクエストに表示されます: 22.6 ms に対して約 1.13 秒。 10.5 MiB 図は、VPS 全体やすべてのアプリケーションではなく、その状態でのこの単純なアプリケーションのプロセス ツリーを示しています。
--prewarm による起動プレウォーミングは、リクエストを受け入れる前にフレームワークを初期化します。その後のアイドル状態のリタイアメントは妨げられず、アプリケーション ページや API ハンドラーは呼び出されません。使用されているレンダー ホストを保持するには、明示的な設定は --worker-idle-seconds 0. です。したがって、プレウォーミングだけでは、スリープ後の復帰のコストは排除されません。
このプローブでは、同等の Next.js スリープ構成はテストされませんでした。外部インフラストラクチャが Next.js を停止または再起動できないということは確立されていません。
異なる時間に訪問したいくつかの小規模プロジェクトの場合、非アクティブなワーカーのメモリを解放すると、アクティブなアプリケーションのためにより多くのスペースを残すことができます。 CPU の効率が向上すると、同じクォータ内でより有用な作業を残すことができます。これは、小規模な公開サイト、デモ、断続的な内部ツールに関係する可能性があります。
これは測定結果からの推論であり、ホスティング密度のベンチマークではありません。追加のプロジェクトがどれだけサーバーに収まるか、請求額やエネルギー節約量を測定したのかは不明です。オペレーティング システム、データベース、ゲートウェイ、同時バーストおよびウェイクアップもリソースを消費します。
このフレームワークには、アプリケーション全体をゲートウェイの背後でスリープ状態にできるローカル prnext host コマンドもあります。これは、ここで測定される労働者の退職とは別のものです。ゲートウェイはアクティブなままです。追跡されたリクエストと接続により進行中の作業が保護され、後でアクセスするとアプリケーションが起動される可能性があります。このキャンペーンでは、総コストは数値化されません。
スリープはプロセス内のみに保持されている状態を破棄します。永続的なデータはディスク上または適切なサービスに属します。追跡されていないバックグラウンド作業は、プロセスの存続に依存してはなりません。マネージド PRNext Host サービスもまた別のレイヤーです。この記事では、その価格設定や導入パフォーマンスを測定するものではありません。
6 回の 10 分間の混合負荷実行で、両方の VPS の 3 つのバリアントがカバーされます。各実行の後に、30 回のストリーミング キャンセルと 46 秒間の静かな時間が続きます。これらの最終キャンペーンでは、コンテンツの障害、ロード エラー、テスト対象サーバーのメモリ不足による強制終了は観察されませんでした。
小さな画面では、表を水平にスクロールします。
| VPS / エンジン | 要求/秒 | 最初の 1 分 RAM (MiB) | 直前 RAM (MiB) |
|---|---|---|---|
| 小 / PRNext | 255.6 | 125.3 | 131.3 |
| 小 / Next.js | 202.3 | 106.5 | 114.8 |
| 大 / PRNext | 348.5 | 119.0 | 130.4 |
| 大 / Next.js | 317.6 | 152.5 | 158.0 |
最初の耐久性の試行では、テストされたサーバーではなく、ロード ジェネレーターのメモリ保持が明らかになりました。ツールを修正した後、同じ修正されたジェネレーターを使用して、6 回の最終実行をすべて繰り返しました。ツールのリンクは、測定されたエンジンのコミットとは別に、コミット fb59284 を指します。
メモリは依然として変動します。制約された大規模 VPS では、最初と最後の 1 分の間に PRNext が 119.0 から 130.4 MiB に移動します。その混合スループットは、その構成における以前の PRNext コードよりも約 12% 低くなります。 10 分では、漏れがないことも、数週間にわたる安定性も確立されません。
キャンセルして待機した後、PRNext のファイル記述子は 44. に戻ります。これだけでは、リークを宣言したり、長期間にわたってリークを除外したりするには十分ではありません。ブラウザ検証では、48 時間指定コンテキストと、強制フォールバックを含む 10 個の機能チェックが追加されます。すべての Next.js アプリケーションとの完全な互換性は実証されていません。
最も有力な議論は、通常の SSR といくつかの制約された予算にわたるストリーミングに対する CPU の効率です。メモリも有利な場合がありますが、このキャンペーンでは物理的な小規模 VPS にはメモリがありません。スリープは、断続的なプロジェクトに別の選択肢を提供します。RAM をリリースするか、ウォーム レスポンスを保持します。
次の優先事項は、重いレンダリングの割り当て、ハイドレーション、一部の予算の下でのスループットの回帰、およびワーカー間のスケーリングです。このキャンペーンでのいくつかのビルド測定も、ビルドが高速になるという一般的な主張を裏付けるものではありません。
PRNext は実験的なものであり、その Next.js 互換性は部分的です。それがアプリケーションに適合するかどうかを判断するには、高価なルート、トラフィック、沈黙期間、および特定されたアーティファクトによるウェイクアップを再現します。これらの結果は、フレームワークの普遍的なランキングではなく、検証可能な出発点を提供します。
PRNext 0.1.18-alpha: published release / version publiée (新しいタブで開きます)
Benchmark data / Données du benchmark (JSON) (新しいタブで開きます)
PRNext: measured source / code mesuré (2856155) (新しいタブで開きます)
Application fixture / application de test (新しいタブで開きます)
Corrected load generator / générateur corrigé (fb59284) (新しいタブで開きます)
PRNext: rendering, prewarming and worker retirement (新しいタブで開きます)