Throughput compared with other Node frameworks
The same three endpoints on Samveys and four popular Node frameworks, measured on one machine with one load generator. The method and the raw JSON are published with the numbers.
Measured on one laptop; Samveys does more work per request by default. Read this before quoting a number
Plain text
GET /ping returns “pong”. Measures the bare cost of the framework.
| Framework | Requests/s | p50 ms | p99 ms | Errors | Spread | vs fastest |
|---|---|---|---|---|---|---|
| Hono (node-server) 4.13.16 | 53,584 | 1 | 2 | 0 | ±10% | fastest |
| node:http (no framework) 26.13.0 | 50,736 | 1 | 3 | 0 | ±6% | 95% |
| Fastify 5.12.8 | 48,860 | 1 | 3 | 0 | ±15% | 91% |
| Express 5.3.0 | 32,773 | 1 | 4 | 0 | ±40% | 61% |
| Samveys (node driver) 1.0.2 | 13,416 | 4 | 8 | 0 | ±25% | 25% |
| Samveys (Fastify driver) 1.0.2 | 11,426 | 5 | 11 | 0 | ±35% | 21% |
JSON with route param
GET /users/:id returns a small JSON object built from the param.
| Framework | Requests/s | p50 ms | p99 ms | Errors | Spread | vs fastest |
|---|---|---|---|---|---|---|
| Hono (node-server) 4.13.16 | 50,900 | 1 | 3 | 0 | ±8% | fastest |
| Fastify 5.12.8 | 50,888 | 1 | 3 | 0 | ±8% | 100% |
| node:http (no framework) 26.13.0 | 46,788 | 1 | 3 | 0 | ±28% | 92% |
| Express 5.3.0 | 31,609 | 1 | 5 | 0 | ±23% | 62% |
| Samveys (node driver) 1.0.2 | 12,932 | 4 | 8 | 0 | ±18% | 25% |
| Samveys (Fastify driver) 1.0.2 | 11,966 | 4 | 11 | 0 | ±31% | 24% |
Validated JSON body
POST /echo parses a JSON body, validates it against a schema and returns it.
| Framework | Requests/s | p50 ms | p99 ms | Errors | Spread | vs fastest |
|---|---|---|---|---|---|---|
| Hono (node-server) 4.13.16 | 43,304 | 1 | 3 | 0 | ±10% | fastest |
| Fastify 5.12.8 | 41,241 | 1 | 4 | 0 | ±12% | 95% |
| node:http (no framework) 26.13.0 | 40,301 | 1 | 4 | 0 | ±35% | 93% |
| Express 5.3.0 | 28,718 | 2 | 4 | 0 | ±40% | 66% |
| Samveys (node driver) 1.0.2 | 8,491 | 6 | 25 | 0 | ±40% | 20% |
| Samveys (Fastify driver) 1.0.2 | 7,508 | 7 | 17 | 0 | ±15% | 17% |
How we measure
Read this before quoting a number
- Samveys does more per request by default: security headers, request ids, Problem Details, timeouts and prototype-less parsing. The others run with their defaults, so they skip most of that.
- Results are from one laptop, not a server. Use them to compare frameworks with each other, not as a capacity figure.
- Real apps spend most of their time in the database and the network, not in the framework.
- Load generator
autocannon 8.0.0- Duration per run
- 8 s
- Rounds
- 3 rounds, interleaved; the median is shown
- Warm-up
- 2 s
- Connections
- 64
- Pipelining
- 1
- Machine
- Apple M5 · 10 cores · 16 GB · darwin 27.0.0
- Node.js
- v26.13.0
- Measured on
- November 5, 2026
Each framework runs alone in its own process; the load generator runs in another.
Scenarios
- Plain text — GET /ping returns “pong”. Measures the bare cost of the framework.
- JSON with route param — GET /users/:id returns a small JSON object built from the param.
- Validated JSON body — POST /echo parses a JSON body, validates it against a schema and returns it.
Raw data
The JSON behind this page: 2026-11-05.json · node scripts/benchmark.ts