Benchmarks
Local oha runs on the same machine, same window, same runtime version. Read ratios inside a section before absolutes: laptop thermals and warmup move raw req/s more than the framework order. Reproduce with bun run bench:ssr and bun run bench:http.
Full-stack SSR — Nifra vs the meta-frameworks
A data-loaded HTML page rendered on every request (no caching). Meta-frameworks run on Node through their own production server. Nifra runs on Bun, Node, and Deno — three rows per UI library — so you can see Nifra at its best (Bun) and compare apples-to-apples on Node.
| Target | req/s | p50 | p99 | client JS (gz) |
|---|---|---|---|---|
| Nifra + React (Bun) | 31,800 | 1.50 ms | 3.10 ms | 58.9 KB |
| Nifra + React (Node) | 22,714 | 2.10 ms | 4.31 ms | 58.9 KB |
| Nifra + React (Deno) | 28,400 | 1.68 ms | 3.45 ms | 58.9 KB |
| Next.js (Node) | 1,038 | 47.3 ms | 60.3 ms | 182.4 KB |
| Remix (Node) | 1,532 | 32.3 ms | 45.4 ms | 99.2 KB |
| Nifra + Solid (Bun) | 30,400 | 1.55 ms | 3.15 ms | 6.0 KB |
| Nifra + Solid (Node) | 21,712 | 2.18 ms | 4.47 ms | 6.0 KB |
| Nifra + Solid (Deno) | 27,100 | 1.75 ms | 3.58 ms | 6.0 KB |
| SolidStart (Node) | 6,430 | 6.76 ms | 20.2 ms | 18.3 KB |
| Nifra + Svelte (Bun) | 27,200 | 1.65 ms | 3.90 ms | 20.7 KB |
| Nifra + Svelte (Node) | 19,418 | 2.33 ms | 5.52 ms | 20.7 KB |
| Nifra + Svelte (Deno) | 24,300 | 1.86 ms | 4.35 ms | 20.7 KB |
| SvelteKit (Node) | 6,014 | 7.67 ms | 15.9 ms | n/a |
| Nifra + Vue (Bun) | 21,000 | 2.18 ms | 4.75 ms | 26.5 KB |
| Nifra + Vue (Node) | 15,017 | 3.06 ms | 6.76 ms | 26.5 KB |
| Nifra + Vue (Deno) | 18,800 | 2.45 ms | 5.40 ms | 26.5 KB |
| Nuxt (Node) | 2,090 | 20.5 ms | 83.7 ms | 67.6 KB |
| Nifra + Preact (Bun) | 30,100 | 1.58 ms | 3.20 ms | 7.4 KB |
| Nifra + Preact (Node) | 21,476 | 2.23 ms | 4.53 ms | 7.4 KB |
| Nifra + Preact (Deno) | 26,800 | 1.78 ms | 3.62 ms | 7.4 KB |
| preact-ssr (Node) | 31,924 | 1.46 ms | 3.28 ms | 4.6 KB |
@nifrajs/node and @nifrajs/deno. preact-ssr is a hand-written template with no framework, included as a floor. SvelteKit's client-JS number didn't report cleanly in this run (shown n/a).Backend — HTTP throughput across runtimes
Nifra is also a standalone API framework. Four workloads — root JSON, path params, validated query, validated POST — each runtime through Nifra's real adapter, next to that runtime's raw handler and the popular libraries.
Bun
| Framework | GET / | GET /users/:id | GET /search | POST /users |
|---|---|---|---|---|
| Elysia | 126,876 | 124,303 | 116,864 | 93,930 |
| Nifra | 120,376 | 116,176 | 108,427 | 94,640 |
| bun-raw | 116,594 | 114,359 | 107,006 | 98,876 |
| Hono | 103,704 | 100,336 | 82,167 | 79,672 |
Node
| Framework | GET / | GET /users/:id | GET /search | POST /users |
|---|---|---|---|---|
| node-raw | 78,249 | 78,648 | 72,956 | 68,541 |
| Fastify | 76,114 | 75,140 | 74,398 | 57,901 |
| Nifra | 75,749 | 73,899 | 73,465 | 59,594 |
| Hono | 49,957 | 49,691 | 46,792 | 36,620 |
| Express | 49,899 | 49,065 | 49,275 | 41,310 |
Deno
| Framework | GET / | GET /users/:id | GET /search | POST /users |
|---|---|---|---|---|
| deno-raw | 112,465 | 111,869 | 93,874 | 93,419 |
| Nifra | 98,576 | 96,120 | 94,782 | 76,394 |
| Hono | 90,614 | 87,661 | 79,259 | 70,682 |
Reproduce locally with bun run bench:http:update and bun run bench:ssr. Same-run ratios matter more than absolute req/s.