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