Router Benchmark
How fast can each router match a URL to a handler and pull out parameters? This benchmark isolates just the routing layer — no HTTP, no middleware, just pure matching.
Full source code: prostojs/router-benchmark
Routers Tested
| Router | Used by | Type |
|---|---|---|
| @prostojs/router | Wooks | Regex-based, indexed |
| find-my-way | Fastify | Radix trie |
| rou3 | h3 / Nitro | Radix trie |
| Hono RegExpRouter | Hono | Compiled RegExp (falls back to TrieRouter on complex sets) |
| Express | Express | Linear scan (baseline) |
Methodology
Each router registers the same set of routes and resolves the same request mix. Importantly, every benchmark forces full parameter extraction — not just matching — so routers that defer param processing don't get an unfair advantage.
The tests cover three route shapes: short paths (2–5 segments), long paths (5–10 segments), and a mixed 50/50 combination. The workload includes statics, parametric routes with up to 4 params, wildcards, multiple HTTP methods, and 404 misses.
Results are in operations per millisecond — higher is better.
Overview by Route Type
Key takeaway
ProstoRouter leads on long, enterprise-style routes while staying competitive on short ones. Hono's RegExpRouter is fastest on short and mixed patterns — but as the scaling section reveals, its compiled regex approach breaks down on larger route sets.
Short Routes (22 routes)
Typical REST APIs with 2–5 segment paths.
Hono's RegExpRouter and ProstoRouter are neck-and-neck here — both far ahead of the trie-based routers. The compiled regex approach excels on compact route sets.
Long Routes (22 routes)
The kind of deep, nested paths you'd see in a real SaaS API — 5–10 segments with shared prefixes and multiple parameters. Think /api/v1/orgs/:orgId/teams/:teamId/projects/:projectId/tasks/:taskId.
ProstoRouter leads here — comfortably ahead of every other router. These are the route patterns that real SaaS APIs actually use, and ProstoRouter handles them best.
Mixed Routes (20 routes)
50/50 combination of short and long routes.
Hono's RegExpRouter leads here thanks to its strong short-route performance. ProstoRouter and Rou3 are close behind.
Long Route Breakdown
A closer look at individual long-route test patterns — this is where router architectures reveal their strengths and weaknesses:
Static lookups: Rou3 dominates pure static resolution thanks to its radix trie optimized for exact matches. Hono comes second. ProstoRouter's regex-based approach trades some static-lookup speed for richer pattern support — still very fast.
Parametric routes: ProstoRouter leads across all parameter counts. The more params a route has, the bigger the gap — ProstoRouter's advantage grows with complexity.
POST/PUT/DELETE with params: ProstoRouter and Hono are essentially tied, both ahead of Rou3 and find-my-way.
404 handling: Hono's RegExpRouter excels at rejecting non-matching URIs — its compiled regex rejects in one step. The other routers handle 404s reasonably well, with find-my-way slightly ahead of ProstoRouter and Rou3.
Scaling: 22 → 200 Routes
Small benchmarks can be deceiving. A router that tops the chart with a handful of routes may not hold up when your application grows. This scaling benchmark reveals what happens as route tables reach real-world sizes.
Short Routes
Long Routes
Mixed Routes
Hono's RegExpRouter hits a wall
Hono's RegExpRouter — the fastest router on small benchmarks — fails to compile its regular expression when route sets grow complex. On long routes beyond 100, and mixed routes beyond 198, Hono silently falls back to its much slower TrieRouter — becoming the slowest non-Express router in the field.
This is the most revealing part of the benchmark. The routers that look fastest in small tests tell a different story at scale:
| Router | Scaling behavior |
|---|---|
| ProstoRouter | Gradual, predictable slowdown (~2x from 22→200 routes) |
| Hono | Hits a cliff — falls back to TrieRouter and drops sharply |
| Rou3 | Nearly flat — trie structure handles growth well |
| find-my-way | Nearly flat — same trie advantage |
ProstoRouter stays fastest through 50 routes across all three route shapes, and remains competitive at 100–200. The trie-based routers (Rou3, find-my-way) degrade less because their structure inherently shares prefix storage — but they start from a lower baseline on parametric routes.
At larger scales, the order reshuffles — find-my-way's stable trie pulls ahead on mixed routes, while ProstoRouter still beats Rou3 and Hono's fallback TrieRouter. A router's architecture matters more than its microbenchmark peak.
Feature Comparison
Raw speed is only part of the picture. @prostojs/router supports features that trie-based routers can't:
| Feature | @prostojs/router | find-my-way | Rou3 | Hono |
|---|---|---|---|---|
| Parametric routes | ✅ | ✅ | ✅ | ✅ |
| Regex constraints on params | ✅ | ✅ | ❌ | ❌ |
| Multiple wildcards per path | ✅ | ❌ | ❌ | ❌ |
| Regex constraints on wildcards | ✅ | ❌ | ❌ | ❌ |
| Optional parameters | ✅ | ❌ | ❌ | ✅ |
| Case-insensitive matching | ✅ | ✅ | ❌ | ❌ |
| Trailing slash normalization | ✅ | ❌ | ❌ | ❌ |
| URL decoding | ✅ | ✅ | ❌ | ❌ |
| Same-name param arrays | ✅ | ❌ | ❌ | ❌ |
@prostojs/router delivers the richest feature set while being the fastest on the route patterns that matter most in production — deeply-nested, parametric paths with multiple parameters.
Benchmark source: prostojs/router-benchmark. Results generated Feb 2026.