# Hono vs Express benchmark servers

These three files are the servers timed for the shipmunks.dev post [Hono vs Express](/blog/hono-vs-express/). Each file exposes the same two routes:

- `GET /json` returns `{"message":"hello","ok":true"}`
- `GET /users/:id` returns `{"id":"<param>","ok":true"}`

Express 5.3.0, Hono 4.13.16 with `@hono/node-server` 2.1.6, and Fastify 5.12.8. Fastify is started with `logger: false` and no response schema. Express keeps its defaults, including `X-Powered-By` and ETag. No middleware is mounted on these routes.

The runner is `scripts/benchmarks/hono-vs-express/bench.mjs` in the shipmunks.dev repo. It installs the pinned versions under `/tmp/hono-vs-express-bench` (override with `BENCH_WORK`), copies these files there, checks the JSON, then runs autocannon 8.0.0. Each route gets one 10 second warmup at 100 connections, then three measured runs of 10 seconds at 100 connections, pipelining 1. The servers run one at a time. The median in the post is the middle of the three measured `requests.average` values, and the same for latency `p99`. The warmup is stored in the CSV and is not in the median.

A rerun will not match the medians. The rows from the run published with the post are [hono-vs-express-benchmark.csv](/files/hono-vs-express-benchmark.csv).
