PRNext 0.1.18 versus Next.js: CPU, RAM and sleep

PRNext 0.1.18-alpha is available. To accompany this release, we are publishing measurements taken on October 29 using its development candidate. On a small VPS, CPU time and memory matter as much as request speed. We compared this code with Next.js on two Linux machines, then constrained their resources to see how the result changes with the workload.

The PRNext candidate delivers 57% more throughput on our 100-row SSR page with a two-CPU budget. On the small VPS, the same page uses about 37% less CPU per response, but more RAM. Together, these results explain the purpose of this comparison: establish where PRNext helps, what it costs and where Next.js does better.

The exact version behind the numbers

The measurements from October 29, 2026 use the 0.1.18-alpha development candidate at commit 2856155. Its manifest still carried the internal version 0.1.17-alpha, but its code and optimizations differ from the npm 0.1.17-alpha package. The exact measured source and artifact hashes are linked at the end of this article.

The reference is Next.js 16.4.3, using the same React 19.3.1 family and application source. The small VPS runs Node.js 22.23.4; the large one runs Node.js 24.22.1. Within each machine, every engine uses the exact same Node executable. Cross-machine differences cannot be attributed to hardware alone because Node changes too.

PRNext runs the Balanced profile and its default Web renderer. The associated data includes the full Linux binary and candidate package hashes, results before the fixes and throughput ranges. The npm 0.1.18-alpha release published on October 30 comes from commit 05a9ccd, with additional build and development fixes. This campaign therefore measures neither the npm 0.1.17-alpha package nor the final 0.1.18-alpha archives. The numbers describe the identified candidate without assigning a new benchmark to subsequent changes.

What we measured

The first VPS has one vCPU and about 1.9 GiB of RAM. The second has eight vCPUs and about 23 GiB. Target processes receive cgroup v2 CPU and memory limits with no swap. The small machine is limited to 70% of one CPU and 700 MiB; the large machine is tested at one CPU and 384 MiB, two CPUs and 1 GiB, then four CPUs and 2 GiB.

The main matrix contains 96 windows: four budgets, four scenarios, three variants and two alternating passes. The variants are PRNext before the fixes, the measured PRNext candidate and Next.js. Each window has five seconds of warm-up followed by fifteen measured seconds, using sixteen connections and gzip. The tables compare the candidate with Next.js and report the median of the two windows for each metric.

The scenarios are a dynamic 100-row SSR page, a 1,000-row page, a sixteen-entry JSON API and a page with a 40 ms Suspense delay. Fresh identifiers and cookies check response correctness and isolation. Throughput counts only successful, validated responses. This is not a comparison of static pages served from a CDN.

The p95 is the duration within which 95% of requests finish in a window. CPU is milliseconds of CPU work per successful response, not latency. RAM is median proportional set size, or PSS, across the target process tree, including the native engine and Node workers. A response can take 100 ms while using only a few milliseconds of CPU.

The load generator has separate limits, but shares the small VPS’s single physical CPU. Fast API scenarios can reach its ceiling, particularly on the small machine and in the four-CPU scenario. Existing services remain active: quotas do not eliminate contention on these VPSs. Two short passes do not provide a confidence interval. Small differences should not become marketing promises.

Small VPS: less CPU, without a general RAM win

At 0.7 CPU and 700 MiB, PRNext serves 81.33 SSR responses per second against Next.js’s 51. Its p95 is 264.25 ms against 420.90 ms. CPU cost falls from 13.39 to 8.46 ms per response, about 37% less. Memory, however, is 113.88 MiB against 101.38 MiB: PRNext uses about 12% more on this page.

Streaming reaches 138.13 requests per second against 80.03, with about 42% less CPU per response. The heavy page is much closer, at 11.33 against 10.33 requests per second. The API favors PRNext in this campaign, but the generator’s competition for the same physical CPU remains a limitation.

On small screens, scroll the table horizontally.

Medians of two windows per scenario and engine. Lower CPU and RAM are better.
Scenario / engineReq/sp95 (ms)CPU (ms/req)RAM (MiB)
SSR 100 / PRNext81.33264.258.46113.88
SSR 100 / Next.js51.00420.9013.39101.38
SSR 1 000 / PRNext11.331,550.2558.92139.51
SSR 1 000 / Next.js10.331,661.8062.10119.46
API JSON / PRNext518.1761.401.27139.63
API JSON / Next.js352.8090.051.94113.08
40 ms streaming / PRNext138.13182.654.98135.32
40 ms streaming / Next.js80.03307.258.62115.54

PRNext uses more PSS than Next.js in all four scenarios on this machine. The observed advantage is primarily CPU efficiency on ordinary SSR and streaming. A blanket claim of lower RAM would misrepresent these results.

One CPU and 384 MiB: a different constraint and tradeoff

On the large VPS limited to one CPU and 384 MiB, the SSR page reaches 99.77 requests per second against 59.90. CPU cost is about 41% lower and PSS about 13% lower. Streaming reaches 220.90 against 86.27 requests per second, using 4.51 against 11.47 ms of CPU per response.

The candidate’s tighter memory policy also reduces RAM relative to our earlier PRNext code, but the API loses about 13% of throughput against that earlier code. PRNext still leads Next.js in this measurement; that does not erase the internal regression. The balance between garbage collection and throughput needs more work.

On small screens, scroll the table horizontally.

Medians of two windows per scenario and engine. Lower CPU and RAM are better.
Scenario / engineReq/sp95 (ms)CPU (ms/req)RAM (MiB)
SSR 100 / PRNext99.77227.209.90109.85
SSR 100 / Next.js59.90365.3516.78126.50
SSR 1 000 / PRNext13.601,329.6572.82139.97
SSR 1 000 / Next.js10.001,932.9095.47158.74
API JSON / PRNext849.6338.751.18128.40
API JSON / Next.js409.1376.852.45163.78
40 ms streaming / PRNext220.90108.504.51140.27
40 ms streaming / Next.js86.27299.3011.47167.14

Two CPUs: a clear SSR gain and a heavy-rendering limit

With two CPUs and 1 GiB, the 100-row SSR page reaches 224.70 requests per second in PRNext against 142.97 in Next.js. That is 57% more throughput, about 26% less CPU per response and 32% less PSS. The p95 is 89.80 ms against 154.60 ms.

The 1,000-row page reverses the result: Next.js reaches 27.63 requests per second against PRNext’s 24, with a p95 of 622.20 ms against 740.80 ms. PRNext uses less RAM but about 29% more CPU per response. Heavy React rendering remains a concrete improvement target.

On small screens, scroll the table horizontally.

Medians of two windows per scenario and engine. Lower CPU and RAM are better.
Scenario / engineReq/sp95 (ms)CPU (ms/req)RAM (MiB)
SSR 100 / PRNext224.7089.757.57117.50
SSR 100 / Next.js142.97154.5510.29173.30
SSR 1 000 / PRNext24.00740.7564.42164.17
SSR 1 000 / Next.js27.63622.2549.91198.96
API JSON / PRNext2,078.3314.000.83144.80
API JSON / Next.js1,001.4028.251.22203.93
40 ms streaming / PRNext341.0055.154.40154.70
40 ms streaming / Next.js218.67105.006.31206.20

Streaming retains about 56% more throughput and about 30% less CPU per response. These results apply to this dynamic application, profile and budget, not every React project.

Four CPUs: topology matters too

At four CPUs and 2 GiB, PRNext uses two workers. Next.js uses two processes behind a private Node proxy, whose CPU and RAM are included. The other three budgets use direct servers. This topology difference is part of the result.

PRNext reaches 383.30 SSR requests per second against 247.13 for this Next.js reference. Its PSS is 206.60 MiB against 458.33 MiB. That does not establish a universal 55% RAM saving: a different topology or proxy could change the result. The API can also reach the generator ceiling.

On small screens, scroll the table horizontally.

Medians of two windows per scenario and engine. Lower CPU and RAM are better.
Scenario / engineReq/sp95 (ms)CPU (ms/req)RAM (MiB)
SSR 100 / PRNext383.3056.358.49206.60
SSR 100 / Next.js247.13133.5011.80458.33
SSR 1 000 / PRNext46.37450.1068.28272.22
SSR 1 000 / Next.js45.50688.8562.55520.04
API JSON / PRNext3,421.178.200.91242.97
API JSON / Next.js1,582.6024.051.90525.35
40 ms streaming / PRNext356.9048.455.09262.35
40 ms streaming / Next.js313.7768.757.98542.40

The candidate loses about 10% of SSR throughput and about 6% on the heavy page compared with our earlier PRNext code at this budget. More CPUs do not guarantee that every path improves. Scaling across workers and heavy-rendering allocations still need work.

Sleep mode: release RAM between visits

A low-traffic site does not spend its day saturating a processor. Idle memory can matter more than peak throughput. PRNext can retire its Node workers after an idle period while keeping the Rust server listening. The next rendering request recreates the workers it needs.

We tested this mechanism on the small VPS with a simple SSR page and an accelerated two-second idle threshold. Memory is observed after worker retirement, which took about two seconds; the keep-warm control waits about six seconds. This is one functional probe per setting, separate from load and endurance tests.

On small screens, scroll the table horizontally.

Wake probe on the small VPS. One observation per setting, same simple SSR page.
PRNext settingQuiet RAM (MiB)Wake request (ms)
Idle worker retirement10.51,130.0
Prewarm then idle retirement10.41,126.6
Prewarm and keep warm106.822.6

In this probe, PSS falls to about 10.5 MiB after worker retirement, against 106.8 MiB when kept warm. The cost appears in the wake request: about 1.13 seconds against 22.6 ms. The 10.5 MiB figure describes this simple application’s process tree in that state, not the whole VPS or every application.

Startup prewarming with --prewarm initializes the framework before accepting requests. It does not prevent subsequent idle retirement and does not call application pages or API handlers. To retain used render hosts, the explicit setting is --worker-idle-seconds 0. Prewarming alone therefore does not eliminate the cost of waking after sleep.

No equivalent Next.js sleep configuration was tested in this probe. It does not establish that external infrastructure cannot stop or restart Next.js.

Indirect benefits for shared hosting

For several small projects visited at different times, releasing inactive workers’ memory can leave more space for active applications. Better CPU efficiency can also leave more useful work within the same quota. This can be relevant to small public sites, demos and intermittent internal tools.

This is an inference from the measurements, not a hosting-density benchmark. We have not established how many additional projects fit on a server or measured a bill or energy saving. The operating system, database, gateway, simultaneous bursts and wake-ups also consume resources.

The framework also has a local prnext host command that can put a whole application to sleep behind a gateway. This is separate from the worker retirement measured here. The gateway remains active; tracked requests and connections protect work in progress, and a later visit can wake the application. This campaign does not quantify its total cost.

Sleep discards state held only inside processes. Durable data belongs on disk or in an appropriate service; untracked background work must not depend on a process staying alive. The managed PRNext Host service is another layer again. This article does not measure its pricing or deployment performance.

Observed stability and the limits of the test

Six ten-minute mixed-load runs cover the three variants on both VPSs. Each run is followed by thirty streaming cancellations and 46 quiet seconds. No content failures, load errors or out-of-memory kills of the tested servers were observed in these final campaigns.

On small screens, scroll the table horizontally.

Ten minutes of mixed load per engine and VPS. The large VPS is limited to 1 CPU and 384 MiB.
VPS / engineReq/sFirst-minute RAM (MiB)Last-minute RAM (MiB)
Small / PRNext255.6125.3131.3
Small / Next.js202.3106.5114.8
Large / PRNext348.5119.0130.4
Large / Next.js317.6152.5158.0

An initial endurance attempt exposed memory retention in the load generator, not the tested server. After fixing the tool, all six final runs were repeated in full with the same corrected generator. The tool link points to commit fb59284, separate from the measured engine commit.

Memory still varies: on the constrained large VPS, PRNext moves from 119.0 to 130.4 MiB between the first and last minute. Its mixed throughput is about 12% below our earlier PRNext code on that configuration. Ten minutes establishes neither the absence of leaks nor stability over several weeks.

After cancellation and waiting, PRNext’s file descriptors fall back to 44. This is not enough to declare a leak or rule one out over longer periods. Browser verification adds 48 timed contexts and ten functional checks, including forced fallbacks. It does not demonstrate complete compatibility with all Next.js applications.

What these results mean for PRNext

The strongest argument is CPU efficiency for ordinary SSR and streaming across several constrained budgets. Memory can also be favorable, but it is not on the physical small VPS in this campaign. Sleep offers another choice for intermittent projects: release RAM or preserve a warm response.

The next priorities are heavy-rendering allocations, hydration, throughput regressions under some budgets and scaling across workers. The few build measurements in this campaign also do not support a general claim of faster builds.

PRNext remains experimental and its Next.js compatibility is partial. To decide whether it fits your application, reproduce its expensive routes, traffic, quiet periods and wake-ups with an identified artifact. These results provide a verifiable starting point, not a universal ranking of frameworks.

Sources and further reading

Back to the blog