Run Time Stats
Runtime apps implement comparable benchmark routes across frameworks. See Default Benchmark Setup for the shared environment and each framework’s build tool and adapter. Test-specific differences are documented in the linked methodology sections below.
Client Side Rendered Tests
Section titled “Client Side Rendered Tests”Methodology: Client Side Rendered Tests.
Some frameworks have been moved off their golden path to make client side tests fair when comparing. See the methodology link above for the full details.
| Framework | First Paint | FCP | Interaction Latency | Input Delay | Processing Duration | Presentation Delay |
|---|---|---|---|---|---|---|
| Astro | 90ms | 89.931ms | 2.179ms | 1.894ms | 0.292ms | 0ms |
| Next.js | 339ms | 339.216ms | 14.69ms | 1.406ms | 4.304ms | 7.916ms |
| Nuxt | 157ms | 157.129ms | 8.552ms | 0.839ms | 1.34ms | 6.471ms |
| Pracht | 85ms | 85.003ms | 18.787ms | 0.839ms | 2.945ms | 12.506ms |
| React Router | 175ms | 174.902ms | 18.466ms | 1.438ms | 2.391ms | 14.508ms |
| SolidStart | 97ms | 96.516ms | 17.882ms | 0.885ms | 2.086ms | 11.731ms |
| SvelteKit | 112ms | 111.554ms | 19.592ms | 0.864ms | 1.789ms | 16.577ms |
| TanStack Start | 115ms | 114.66ms | 21.99ms | 1.239ms | 2.771ms | 17.986ms |
| Framework | Milliseconds |
|---|---|
| Pracht | 85.00 ms |
| Astro | 90.00 ms |
| SolidStart | 97.00 ms |
| SvelteKit | 112.00 ms |
| TanStack Start | 115.00 ms |
| Nuxt | 157.00 ms |
| React Router | 175.00 ms |
| Next.js | 339.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Pracht | 85.00 ms |
| Astro | 89.93 ms |
| SolidStart | 96.52 ms |
| SvelteKit | 111.55 ms |
| TanStack Start | 114.66 ms |
| Nuxt | 157.13 ms |
| React Router | 174.90 ms |
| Next.js | 339.22 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Interaction Breakdown
Total latency is split into the three consecutive phases reported by Lighthouse.
- The input delay, which starts when the user initiates an interaction with the page, and ends when the event callbacks for the interaction begin to run.
- The processing duration, which consists of the time it takes for event callbacks to run to completion.
- The presentation delay, which is the time it takes for the browser to present the next frame which contains the visual result of the interaction.
| Framework or version | Interaction latency | Input delay | Processing duration | Presentation delay |
|---|---|---|---|---|
| Astro | 2.18 ms | 1.89 ms | 0.29 ms | 0.00 ms |
| Nuxt | 8.55 ms | 0.84 ms | 1.34 ms | 6.47 ms |
| Next.js | 14.69 ms | 1.41 ms | 4.30 ms | 7.92 ms |
| SolidStart | 17.88 ms | 0.89 ms | 2.09 ms | 11.73 ms |
| React Router | 18.47 ms | 1.44 ms | 2.39 ms | 14.51 ms |
| Pracht | 18.79 ms | 0.84 ms | 2.94 ms | 12.51 ms |
| SvelteKit | 19.59 ms | 0.86 ms | 1.79 ms | 16.58 ms |
| TanStack Start | 21.99 ms | 1.24 ms | 2.77 ms | 17.99 ms |
Server Side Rendered Tests
Section titled “Server Side Rendered Tests”Methodology: Server Side Rendered Tests.
| Framework | First Paint | FCP | Interaction Latency | Input Delay | Processing Duration | Presentation Delay |
|---|---|---|---|---|---|---|
| Astro | 59ms | 59.412ms | 0.924ms | 0.639ms | 0.248ms | 0ms |
| Next.js | 381ms | 380.958ms | 18.555ms | 1.428ms | 4.782ms | 12.53ms |
| Nuxt | 88ms | 87.937ms | 9.862ms | 0.789ms | 1.146ms | 7.951ms |
| Pracht | 84ms | 84.048ms | 16.654ms | 0.899ms | 2.216ms | 12.663ms |
| React Router | 108ms | 107.867ms | 15.9ms | 1.625ms | 3.86ms | 9.744ms |
| SolidStart | 86ms | 85.925ms | 14.344ms | 0.852ms | 2.206ms | 10.387ms |
| SvelteKit | 84ms | 83.539ms | 18.188ms | 0.825ms | 2.339ms | 15.024ms |
| TanStack Start | 89ms | 89.048ms | 19.303ms | 1.554ms | 3.981ms | 13.309ms |
| Framework | Milliseconds |
|---|---|
| Astro | 59.00 ms |
| Pracht | 84.00 ms |
| SvelteKit | 84.00 ms |
| SolidStart | 86.00 ms |
| Nuxt | 88.00 ms |
| TanStack Start | 89.00 ms |
| React Router | 108.00 ms |
| Next.js | 381.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Astro | 59.41 ms |
| SvelteKit | 83.54 ms |
| Pracht | 84.05 ms |
| SolidStart | 85.92 ms |
| Nuxt | 87.94 ms |
| TanStack Start | 89.05 ms |
| React Router | 107.87 ms |
| Next.js | 380.96 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Interaction Breakdown
Total latency is split into the three consecutive phases reported by Lighthouse.
- The input delay, which starts when the user initiates an interaction with the page, and ends when the event callbacks for the interaction begin to run.
- The processing duration, which consists of the time it takes for event callbacks to run to completion.
- The presentation delay, which is the time it takes for the browser to present the next frame which contains the visual result of the interaction.
| Framework or version | Interaction latency | Input delay | Processing duration | Presentation delay |
|---|---|---|---|---|
| Astro | 0.92 ms | 0.64 ms | 0.25 ms | 0.00 ms |
| Nuxt | 9.86 ms | 0.79 ms | 1.15 ms | 7.95 ms |
| SolidStart | 14.34 ms | 0.85 ms | 2.21 ms | 10.39 ms |
| React Router | 15.90 ms | 1.63 ms | 3.86 ms | 9.74 ms |
| Pracht | 16.65 ms | 0.90 ms | 2.22 ms | 12.66 ms |
| SvelteKit | 18.19 ms | 0.82 ms | 2.34 ms | 15.02 ms |
| Next.js | 18.55 ms | 1.43 ms | 4.78 ms | 12.53 ms |
| TanStack Start | 19.30 ms | 1.55 ms | 3.98 ms | 13.31 ms |
Server Side Throughput Tests
Section titled “Server Side Throughput Tests”Methodology: Server Side Throughput Tests.
| Framework | Ops/sec | Median Latency | Body Size | Duplication |
|---|---|---|---|---|
| Baseline HTML | 832 | 1.217ms | 96.83kb | 1x |
| Astro | 769 | 1.43ms | 96.89kb | 1x |
| Next.js | 135 | 7.65ms | 204.56kb | 2x |
| Nuxt | 401 | 2.575ms | 201.73kb | 2x |
| Pracht | 611 | 1.709ms | 187.02kb | 2x |
| React Router | 363 | 2.774ms | 216.98kb | 2x |
| SolidStart | 404 | 2.515ms | 224.26kb | 2x |
| SvelteKit | 460 | 2.2ms | 184.29kb | 2x |
| TanStack Start | 382 | 2.642ms | 192.53kb | 2x |
| Framework | Operations per second |
|---|---|
| Baseline HTML | 832 |
| Astro | 769 |
| Pracht | 611 |
| SvelteKit | 460 |
| SolidStart | 404 |
| Nuxt | 401 |
| TanStack Start | 382 |
| React Router | 363 |
| Next.js | 135 |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Kilobytes |
|---|---|
| Baseline HTML | 96.83 KB |
| Astro | 96.89 KB |
| SvelteKit | 184.29 KB |
| Pracht | 187.02 KB |
| TanStack Start | 192.53 KB |
| Nuxt | 201.73 KB |
| Next.js | 204.56 KB |
| React Router | 216.98 KB |
| SolidStart | 224.26 KB |
The chart includes a dotted median reference line calculated from the visible framework values.
Median of measured run average latencies; not a pooled request-level median.
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 1.22 ms |
| Astro | 1.43 ms |
| Pracht | 1.71 ms |
| SvelteKit | 2.20 ms |
| SolidStart | 2.52 ms |
| Nuxt | 2.58 ms |
| TanStack Start | 2.64 ms |
| React Router | 2.77 ms |
| Next.js | 7.65 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
SSR Load Test
Section titled “SSR Load Test”Methodology: SSR Load Test.
Each runtime app renders the same 1,000-row, three-column table using ordinary
<a> links. This compares server rendering under HTTP load without the extra work
of rendering framework router link components. Requests still pass through each
framework’s server routing. No browser runs and no links are clicked.
| Framework | Representative peak req/s | Representative peak connections | Median sweep P99 @ 25 | Median sweep P99 @ 50 | Median sweep P99 @ 100 | Total measured requests |
|---|---|---|---|---|---|---|
| Baseline HTML | 1,775.6 | 100 | 17ms | 39ms | 95ms | 155,644 |
| Astro | 1,608.2 | 50 | 23ms | 50ms | 91ms | 139,596 |
| Next.js | 55 | 5 | 1,185ms | 4,085ms | 4,676ms | 4,983 |
| Nuxt | 525 | 25 | 74ms | 373ms | 2,788ms | 50,350 |
| Pracht | 708 | 25 | 37ms | 111ms | 974ms | 65,067 |
| React Router | 332.8 | 50 | 103ms | 556ms | 3,441ms | 33,018 |
| SolidStart | 570.8 | 25 | 90ms | 301ms | 1,994ms | 55,494 |
| SvelteKit | 587.21 | 25 | 74ms | 238ms | 2,100ms | 56,026 |
| TanStack Start | 378.4 | 100 | 119ms | 642ms | 2,570ms | 37,870 |
P99 Latency
Section titled “P99 Latency”| Framework | Milliseconds |
|---|---|
| Baseline HTML | 17.00 ms |
| Astro | 23.00 ms |
| Pracht | 37.00 ms |
| Nuxt | 74.00 ms |
| SvelteKit | 74.00 ms |
| SolidStart | 90.00 ms |
| React Router | 103.00 ms |
| TanStack Start | 119.00 ms |
| Next.js | 1185.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 39.00 ms |
| Astro | 50.00 ms |
| Pracht | 111.00 ms |
| SvelteKit | 238.00 ms |
| SolidStart | 301.00 ms |
| Nuxt | 373.00 ms |
| React Router | 556.00 ms |
| TanStack Start | 642.00 ms |
| Next.js | 4085.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Astro | 91.00 ms |
| Baseline HTML | 95.00 ms |
| Pracht | 974.00 ms |
| SolidStart | 1994.00 ms |
| SvelteKit | 2100.00 ms |
| TanStack Start | 2570.00 ms |
| Nuxt | 2788.00 ms |
| React Router | 3441.00 ms |
| Next.js | 4676.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P90 Latency
Section titled “P90 Latency”| Framework | Milliseconds |
|---|---|
| Baseline HTML | 16.00 ms |
| Astro | 17.00 ms |
| Pracht | 36.00 ms |
| Nuxt | 48.00 ms |
| SvelteKit | 55.00 ms |
| SolidStart | 64.00 ms |
| React Router | 76.00 ms |
| TanStack Start | 83.00 ms |
| Next.js | 505.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 30.00 ms |
| Astro | 31.00 ms |
| Pracht | 71.00 ms |
| Nuxt | 105.00 ms |
| SvelteKit | 121.00 ms |
| SolidStart | 138.00 ms |
| React Router | 153.00 ms |
| TanStack Start | 179.00 ms |
| Next.js | 1693.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Astro | 64.00 ms |
| Baseline HTML | 69.00 ms |
| SolidStart | 139.00 ms |
| Pracht | 150.00 ms |
| Nuxt | 184.00 ms |
| SvelteKit | 203.00 ms |
| TanStack Start | 234.00 ms |
| React Router | 291.00 ms |
| Next.js | 2172.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P75 Latency
Section titled “P75 Latency”| Framework | Milliseconds |
|---|---|
| Baseline HTML | 14.00 ms |
| Astro | 16.00 ms |
| Pracht | 35.00 ms |
| SvelteKit | 42.00 ms |
| Nuxt | 47.00 ms |
| SolidStart | 54.00 ms |
| TanStack Start | 70.00 ms |
| React Router | 75.00 ms |
| Next.js | 484.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 30.00 ms |
| Astro | 31.00 ms |
| Pracht | 70.00 ms |
| SolidStart | 87.00 ms |
| Nuxt | 95.00 ms |
| SvelteKit | 97.00 ms |
| TanStack Start | 142.00 ms |
| React Router | 148.00 ms |
| Next.js | 953.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 57.00 ms |
| Astro | 62.00 ms |
| SolidStart | 121.00 ms |
| SvelteKit | 137.00 ms |
| Pracht | 148.00 ms |
| Nuxt | 163.00 ms |
| TanStack Start | 187.00 ms |
| React Router | 261.00 ms |
| Next.js | 991.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
SSR Router Link Load Test
Section titled “SSR Router Link Load Test”Methodology: SSR Router Link Load Test.
The same load test using framework router link components, showing how rendering those components affects server performance compared with ordinary HTML links.
| Framework | Representative peak req/s | Representative peak connections | Median sweep P99 @ 25 | Median sweep P99 @ 50 | Median sweep P99 @ 100 | Total measured requests |
|---|---|---|---|---|---|---|
| Next.js | 50.6 | 5 | 1,292ms | 4,576ms | 4,769ms | 4,436 |
| Nuxt | 183.8 | 5 | 407ms | 2,642ms | 3,682ms | 18,008 |
| Pracht | 387 | 25 | 93ms | 418ms | 2,770ms | 35,352 |
| React Router | 165.6 | 50 | 273ms | 1,741ms | 3,875ms | 16,478 |
| TanStack Start | 257.2 | 5 | 191ms | 1,109ms | 3,036ms | 25,810 |
P99 Latency
Section titled “P99 Latency”| Framework | Milliseconds |
|---|---|
| Pracht | 93.00 ms |
| TanStack Start | 191.00 ms |
| React Router | 273.00 ms |
| Nuxt | 407.00 ms |
| Next.js | 1292.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Pracht | 418.00 ms |
| TanStack Start | 1109.00 ms |
| React Router | 1741.00 ms |
| Nuxt | 2642.00 ms |
| Next.js | 4576.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Pracht | 2770.00 ms |
| TanStack Start | 3036.00 ms |
| Nuxt | 3682.00 ms |
| React Router | 3875.00 ms |
| Next.js | 4769.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P90 Latency
Section titled “P90 Latency”| Framework | Milliseconds |
|---|---|
| Pracht | 65.00 ms |
| TanStack Start | 124.00 ms |
| Nuxt | 142.00 ms |
| React Router | 170.00 ms |
| Next.js | 545.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Pracht | 140.00 ms |
| TanStack Start | 267.00 ms |
| Nuxt | 280.00 ms |
| React Router | 305.00 ms |
| Next.js | 2104.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Pracht | 269.00 ms |
| TanStack Start | 282.00 ms |
| Nuxt | 316.00 ms |
| React Router | 403.00 ms |
| Next.js | 2522.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P75 Latency
Section titled “P75 Latency”| Framework | Milliseconds |
|---|---|
| Pracht | 64.00 ms |
| TanStack Start | 98.00 ms |
| Nuxt | 134.00 ms |
| React Router | 151.00 ms |
| Next.js | 529.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| Pracht | 131.00 ms |
| TanStack Start | 194.00 ms |
| Nuxt | 276.00 ms |
| React Router | 292.00 ms |
| Next.js | 1016.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
| Framework | Milliseconds |
|---|---|
| TanStack Start | 225.00 ms |
| Pracht | 247.00 ms |
| Nuxt | 288.00 ms |
| React Router | 369.00 ms |
| Next.js | 1078.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Core Web Vitals
Section titled “Core Web Vitals”Methodology: Core Web Vitals.
CWV Desktop
Section titled “CWV Desktop”| Framework | LCP% | CLS% | FCP% | TTFB% | INP% |
|---|---|---|---|---|---|
| Astro | 93 | 89 | 92 | 81 | 98 |
| SolidStart | 100 | 77 | 100 | 85 | 100 |
| SvelteKit | 79 | 78 | 77 | 68 | 95 |
| Next.js | 74 | 72 | 76 | 66 | 94 |
| TanStack Start | 55 | 81 | 46 | 29 | 91 |
| Nuxt | 68 | 58 | 69 | 59 | 96 |
| React Router | 59 | 61 | 65 | 68 | 90 |
Measures how fast a page's main content loads. To provide a good user experience, the LCP should be 2.5 seconds or less.
| Framework | % |
|---|---|
| SolidStart | 100 |
| Astro | 93 |
| SvelteKit | 79 |
| Next.js | 74 |
| Nuxt | 68 |
| React Router | 59 |
| TanStack Start | 55 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures how much and how far content unexpectedly moves on a page. To provide a good user experience, sites should maintain a CLS score of 0.1 or less for at least 75% of page visits.
| Framework | % |
|---|---|
| Astro | 89 |
| TanStack Start | 81 |
| SvelteKit | 78 |
| SolidStart | 77 |
| Next.js | 72 |
| React Router | 61 |
| Nuxt | 58 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures initial loading speed. To provide a good user experience, the FCP should be 1.8 seconds or less.
| Framework | % |
|---|---|
| SolidStart | 100 |
| Astro | 92 |
| SvelteKit | 77 |
| Next.js | 76 |
| Nuxt | 69 |
| React Router | 65 |
| TanStack Start | 46 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures the time between the request for a resource and when the first byte of a response begins to arrive. A good TTFB is less than or equal to 800ms.
| Framework | % |
|---|---|
| SolidStart | 85 |
| Astro | 81 |
| React Router | 68 |
| SvelteKit | 68 |
| Next.js | 66 |
| Nuxt | 59 |
| TanStack Start | 29 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures overall page responsiveness to user actions. To provide a good user experience, the INP should be 200ms or less.
| Framework | % |
|---|---|
| SolidStart | 100 |
| Astro | 98 |
| Nuxt | 96 |
| SvelteKit | 95 |
| Next.js | 94 |
| TanStack Start | 91 |
| React Router | 90 |
The chart includes a dotted median reference line calculated from the visible framework values.
CWV Mobile
Section titled “CWV Mobile”| Framework | LCP% | CLS% | FCP% | TTFB% | INP% |
|---|---|---|---|---|---|
| Astro | 80 | 93 | 73 | 64 | 85 |
| SolidStart | 88 | 66 | 88 | 85 | 75 |
| SvelteKit | 67 | 81 | 58 | 54 | 74 |
| Next.js | 53 | 72 | 48 | 45 | 59 |
| Nuxt | 46 | 59 | 44 | 46 | 65 |
| React Router | 37 | 63 | 37 | 50 | 53 |
| TanStack Start | 31 | 84 | 19 | 13 | 51 |
Measures how fast a page's main content loads. To provide a good user experience, the LCP should be 2.5 seconds or less.
| Framework | % |
|---|---|
| SolidStart | 88 |
| Astro | 80 |
| SvelteKit | 67 |
| Next.js | 53 |
| Nuxt | 46 |
| React Router | 37 |
| TanStack Start | 31 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures how much and how far content unexpectedly moves on a page. To provide a good user experience, sites should maintain a CLS score of 0.1 or less for at least 75% of page visits.
| Framework | % |
|---|---|
| Astro | 93 |
| TanStack Start | 84 |
| SvelteKit | 81 |
| Next.js | 72 |
| SolidStart | 66 |
| React Router | 63 |
| Nuxt | 59 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures initial loading speed. To provide a good user experience, the FCP should be 1.8 seconds or less.
| Framework | % |
|---|---|
| SolidStart | 88 |
| Astro | 73 |
| SvelteKit | 58 |
| Next.js | 48 |
| Nuxt | 44 |
| React Router | 37 |
| TanStack Start | 19 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures the time between the request for a resource and when the first byte of a response begins to arrive. A good TTFB is less than or equal to 800ms.
| Framework | % |
|---|---|
| SolidStart | 85 |
| Astro | 64 |
| SvelteKit | 54 |
| React Router | 50 |
| Nuxt | 46 |
| Next.js | 45 |
| TanStack Start | 13 |
The chart includes a dotted median reference line calculated from the visible framework values.
Measures overall page responsiveness to user actions. To provide a good user experience, the INP should be 200ms or less.
| Framework | % |
|---|---|
| Astro | 85 |
| SolidStart | 75 |
| SvelteKit | 74 |
| Nuxt | 65 |
| Next.js | 59 |
| React Router | 53 |
| TanStack Start | 51 |
The chart includes a dotted median reference line calculated from the visible framework values.