Benchmarks

Median results from interleaved rounds. Compare within each runtime; absolute rates vary by runner.

Full-stack SSR - Nifra vs the meta-frameworks

2026-11-10 · GitHub Actions accuracy run #42798158115; SSR payloads rebuilt from Nifra 5.13.0 · Node: ubuntu-26.04 · AMD EPYC 9V74 80-Core Processor · 4 vCPU; Bun: ubuntu-26.04 · AMD EPYC 7763 64-Core Processor · 4 vCPU · Bun 1.4.4, Node 26.13.0, Deno 2.9.7 · oha 1.16.0 · 50 connections

Each framework has uncached SSR and cached SSG/ISR rows. Compare Nifra's Node app with the Node meta-frameworks; multipliers use the uncached rows.

Next.js and all dynamic SSR rows are measured uncompressed (accept-encoding: identity) for like-for-like throughput.

Nifra also projects and validates loaderOutput for the client; comparator rows have no equivalent output boundary.

18×Nifra + React vs Next.js 16.4.6 (Node)
8.3×Nifra + Vue vs Nuxt 4.6.4 (Node)
5.3×Nifra + Svelte vs SvelteKit 3.2.0 (Node)
2.8×Nifra + Solid vs SolidStart 2.2.2 (Node)

The static-host row is a plain Bun file server; no Nifra code runs per request.

React

A · Dynamic SSR

TargetMedian req/sp50p99client JS (gz)
Nifra + React (Node)v5.13.015,2603.11 ms6.23 ms91.4 KB
Nifra + React (Bun)v5.13.013,8463.44 ms7.00 ms91.4 KB
Remix / React Router (Node)v8.5.11,89425.97 ms49.13 ms107.1 KB
Next.js (Node)v16.4.683957.37 ms105.50 ms172 KB

B · Cached SSG/ISR (cache warmed before measurement)

TargetMedian req/sp50p99client JS (gz)
Nifra + React SSG (Bun)v5.13.060,4470.78 ms1.65 ms91.7 KB
Nifra + React ISR (Bun)v5.13.048,2060.97 ms2.14 ms91.4 KB
Nifra + React SSG (Node)v5.13.032,1161.48 ms2.97 ms91.7 KB
Nifra + React ISR (Node)v5.13.020,6692.26 ms4.52 ms91.4 KB
Nifra + React SSG files on a static hostv5.13.018,2052.71 ms3.17 ms91.7 KB
Next.js ISR (Node)v16.4.63,76712.51 ms27.54 ms172 KB
Next.js static (Node)v16.4.63,76112.53 ms26.33 ms172 KB

Solid

A · Dynamic SSR

TargetMedian req/sp50p99client JS (gz)
Nifra + Solid (Node)v5.13.015,0772.91 ms6.76 ms22.6 KB
Nifra + Solid (Bun)v5.13.013,9703.49 ms5.93 ms22.6 KB
SolidStart (Node)v2.2.25,3996.43 ms27.68 ms14.5 KB

B · Cached SSG/ISR (cache warmed before measurement)

TargetMedian req/sp50p99client JS (gz)
Nifra + Solid SSG (Bun)v5.13.059,1190.80 ms1.68 ms22.9 KB
Nifra + Solid SSG (Node)v5.13.031,7621.50 ms3.01 ms22.9 KB
SolidStart static (Node)v2.2.222,2122.21 ms3.55 ms14 KB
Nifra + Solid SSG files on a static hostv5.13.018,2902.70 ms3.08 ms22.9 KB

Vue

A · Dynamic SSR

TargetMedian req/sp50p99client JS (gz)
Nifra + Vue (Bun)v5.13.012,7803.68 ms7.77 ms26 KB
Nifra + Vue (Node)v5.13.011,3863.71 ms10.47 ms26 KB
Nuxt (Node)v4.6.41,37135.73 ms69.95 ms75.9 KB

B · Cached SSG/ISR (cache warmed before measurement)

TargetMedian req/sp50p99client JS (gz)
Nifra + Vue SSG (Bun)v5.13.058,7000.78 ms1.88 ms26.4 KB
Nifra + Vue SSG (Node)v5.13.032,5741.47 ms2.94 ms26.4 KB
Nifra + Vue SSG files on a static hostv5.13.018,4172.68 ms3.08 ms26.4 KB
Nuxt static (Node)v4.6.417,1532.73 ms4.85 ms70.4 KB

Svelte

A · Dynamic SSR

TargetMedian req/sp50p99client JS (gz)
Nifra + Svelte (Node)v5.13.019,4642.45 ms4.86 ms23.2 KB
Nifra + Svelte (Bun)v5.13.018,1152.55 ms5.44 ms23.2 KB
SvelteKit (Node)v3.2.03,65112.32 ms27.85 ms33 KB

B · Cached SSG/ISR (cache warmed before measurement)

TargetMedian req/sp50p99client JS (gz)
Nifra + Svelte SSG (Bun)v5.13.060,6630.78 ms1.66 ms23.5 KB
Nifra + Svelte SSG (Node)v5.13.032,2291.48 ms2.96 ms23.5 KB
Nifra + Svelte SSG files on a static hostv5.13.018,5242.67 ms3.03 ms23.5 KB
SvelteKit static (Node)v3.2.012,1073.51 ms11.10 ms33.2 KB

Preact

A · Dynamic SSR

TargetMedian req/sp50p99client JS (gz)
Raw Preact render (Node, ceiling)v6.8.231,3011.52 ms3.05 ms4.7 KB
Nifra + Preact (Node)v5.13.017,5612.58 ms6.37 ms25.4 KB
Nifra + Preact (Bun)v5.13.015,6933.21 ms6.15 ms25.4 KB

B · Cached SSG/ISR (cache warmed before measurement)

TargetMedian req/sp50p99client JS (gz)
Nifra + Preact SSG (Bun)v5.13.060,8460.77 ms1.63 ms25.8 KB
Nifra + Preact SSG (Node)v5.13.032,4691.47 ms2.94 ms25.8 KB
Nifra + Preact SSG files on a static hostv5.13.018,4562.68 ms3.04 ms25.8 KB
Preact uses a renderer-only baseline because Fresh is Deno-only. Bun and Node SSR use separate runners; compare rates within each runtime. n/a means client JS could not be measured from the HTML.

Backend - HTTP throughput across runtimes

2026-11-10 · GitHub Actions accuracy run #42798158115 · Node: ubuntu-26.04 · Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz · 4 vCPU; Bun: ubuntu-26.04 · Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz · 4 vCPU; Deno: ubuntu-26.04 · Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz · 4 vCPU · Bun 1.4.4, Node 26.13.0, Deno 2.9.7 · oha 1.16.0 · 50 connections

Four workloads, ranked by their geometric mean.

Fastify on Bun/Deno uses node:http compatibility, not native ingress.

Bun 1.4.4

FrameworkGET /GET /users/:idGET /search?queryPOST /users
Nifrav5.13.0131,092125,850113,36075,104
Elysiav1.4.30129,046126,802113,14672,925
Honov4.13.13109,421101,68169,71659,738
Fastifyv5.12.763,36061,83857,13043,973

Node 26.13.0

FrameworkGET /GET /users/:idGET /search?queryPOST /users
Nifrav5.13.059,97857,95955,91737,525
Fastifyv5.12.756,66353,28752,00135,774
Honov4.13.1353,32650,33437,73729,549
Elysiav1.4.3041,83939,53939,03320,414
Expressv5.3.026,98826,23825,89518,420

Deno 2.9.7

FrameworkGET /GET /users/:idGET /search?queryPOST /users
Nifrav5.13.0125,564119,295109,83872,996
Elysiav1.4.30112,508102,250102,46751,134
Honov4.13.13120,566111,00069,03063,406
Fastifyv5.12.741,55039,97439,23635,804

Backend - the same routes with a real route's work

2026-11-10 · GitHub Actions accuracy run #42798158115 · Node: ubuntu-26.04 · Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz · 4 vCPU; Bun: ubuntu-26.04 · Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz · 4 vCPU; Deno: ubuntu-26.04 · Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz · 4 vCPU · Bun 1.4.4, Node 26.13.0, Deno 2.9.7 · oha 1.16.0 · 50 connections

The same routes with security headers, CORS, request ID, bearer auth, and cookie handling.

Allowed-origin GET/POST only; CORS preflight and rejected origins are excluded.

Bun 1.4.4

FrameworkGET /api/ordersPOST /api/ordersGET + body hash
Nifrav5.13.058,76951,71743,513
Elysiav1.4.3049,68643,49735,308
Honov4.13.1343,09141,60128,308
Fastifyv5.12.738,76932,34035,210

Node 26.13.0

FrameworkGET /api/ordersPOST /api/ordersGET + body hash
Nifrav5.13.037,71230,57333,016
Fastifyv5.12.735,95128,92832,868
Expressv5.3.018,72516,05918,567
Elysiav1.4.3020,86314,67612,894
Honov4.13.1320,49419,0299,823

Deno 2.9.7

FrameworkGET /api/ordersPOST /api/ordersGET + body hash
Nifrav5.13.036,67639,38428,807
Fastifyv5.12.727,03427,70825,090
Elysiav1.4.3028,13725,15319,323
Honov4.13.1327,66731,25312,474

Backend - memory footprint across runtimes

RSS is process-wide after GC; POST heap is retained JavaScript memory.

Median of 5 fresh processes · 50k GETs + POSTs per process · 50 connections · sorted by after-POST RSS; Low marks each column's minimum.

Node 26.13.0

2026-11-10 · Capture run · AMD EPYC 9V45 96-Core Processor

FrameworkReady RSSAfter GETAfter POSTPeak RSSPOST heap
Nifrav5.13.099.5 MiB120.9 MiB121.6 MiBLow121.6 MiBLow15.0 MiB
Honov4.13.1396.8 MiBLow116.3 MiBLow124.3 MiB124.3 MiB12.9 MiBLow
Fastifyv5.12.7106.3 MiB125.3 MiB126.5 MiB126.5 MiB16.9 MiB
Expressv5.3.0102.0 MiB124.4 MiB127.7 MiB127.7 MiB15.0 MiB
Elysiav1.4.30104.0 MiB124.6 MiB207.1 MiB207.1 MiB16.7 MiB

Bun 1.4.4

2026-11-10 · Capture run · AMD EPYC 9V45 96-Core Processor

FrameworkReady RSSAfter GETAfter POSTPeak RSSPOST heap
Honov4.13.1335.8 MiBLow47.1 MiBLow49.0 MiBLow60.0 MiB1.6 MiBLow
Nifrav5.13.037.3 MiB47.8 MiB50.0 MiB57.1 MiBLow1.9 MiB
Elysiav1.4.3045.9 MiB51.3 MiB53.5 MiB64.9 MiB3.0 MiB
Expressv5.3.052.5 MiB69.6 MiB74.3 MiB88.3 MiB5.7 MiB
Fastifyv5.12.762.2 MiB76.2 MiB80.1 MiB90.5 MiB8.1 MiB

Deno 2.9.7

2026-11-10 · Capture run · AMD EPYC 9V45 96-Core Processor

FrameworkReady RSSAfter GETAfter POSTPeak RSSPOST heap
Nifrav5.13.057.9 MiB72.3 MiBLow74.0 MiBLow73.8 MiBLow6.8 MiB
Honov4.13.1357.5 MiBLow76.3 MiB77.2 MiB77.3 MiB6.7 MiBLow
Elysiav1.4.3066.3 MiB81.0 MiB136.4 MiB136.1 MiB10.3 MiB
Expressv5.3.070.6 MiB167.5 MiB174.1 MiB175.6 MiB9.9 MiB
Fastifyv5.12.776.6 MiB170.7 MiB177.7 MiB177.4 MiB11.8 MiB