Skip to content

Commit 17bab41

Browse files
committed
bench(router): add benchmarks for all routing features
- Add any-method matching benchmark - Add catch-all globstar route benchmark - Add regex parameter route benchmark - Add routes for regex param, POST method, and any-method - Add single wildcard route benchmark - Add without-params lookup benchmark - Update README with Deno 2.8.1 results for all 9 benchmarks
1 parent f10b0cf commit 17bab41

2 files changed

Lines changed: 59 additions & 11 deletions

File tree

bench/README.md

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,33 @@
22

33
## Performance Overview
44

5-
Benchmarks run on **Apple M3 Pro** with **Deno 2.5.4**
5+
Benchmarks run on **Apple M3 Pro** with **Deno 2.8.1**
66

77
### Route Lookup Performance
88

9-
| Route Type | Average Time | Operations/sec | Min | Max | p75 | p99 |
10-
| ------------- | ------------ | -------------- | -------- | -------- | -------- | -------- |
11-
| **Static** | 12.7 ns | 78,490,000 | 12.0 ns | 32.2 ns | 13.0 ns | 16.8 ns |
12-
| **Parameter** | 79.5 ns | 12,580,000 | 74.5 ns | 106.1 ns | 80.9 ns | 94.3 ns |
13-
| **Nested** | 119.5 ns | 8,372,000 | 115.2 ns | 144.7 ns | 121.2 ns | 131.1 ns |
14-
| **No Match** | 59.3 ns | 16,860,000 | 56.4 ns | 70.0 ns | 60.1 ns | 67.2 ns |
9+
| Route Type | Average Time | Operations/sec | Min | Max | p75 | p99 |
10+
| --------------------- | ------------ | -------------- | -------- | -------- | -------- | -------- |
11+
| **Static** | 12.1 ns | 82,940,000 | 11.0 ns | 19.2 ns | 12.1 ns | 13.7 ns |
12+
| **Named Parameter** | 80.3 ns | 12,460,000 | 72.2 ns | 103.7 ns | 81.3 ns | 88.9 ns |
13+
| **Nested Parameter** | 122.9 ns | 8,139,000 | 111.5 ns | 158.8 ns | 124.3 ns | 133.8 ns |
14+
| **Regex Parameter** | 296.5 ns | 3,373,000 | 274.8 ns | 333.9 ns | 302.1 ns | 313.1 ns |
15+
| **Single Wildcard** | 115.7 ns | 8,646,000 | 104.3 ns | 149.2 ns | 117.0 ns | 127.9 ns |
16+
| **Catch-all Globstar**| 151.4 ns | 6,603,000 | 136.9 ns | 180.7 ns | 154.0 ns | 162.2 ns |
17+
| **Any-method** | 23.4 ns | 42,770,000 | 21.2 ns | 62.8 ns | 23.8 ns | 27.6 ns |
18+
| **Without Params** | 80.3 ns | 12,460,000 | 69.5 ns | 230.0 ns | 79.6 ns | 104.3 ns |
19+
| **No Match** | 64.5 ns | 15,510,000 | 57.3 ns | 120.0 ns | 65.6 ns | 75.0 ns |
1520

1621
### Key Metrics
1722

18-
- **Static Routes**: ~13 ns - Direct O(1) hash lookup
19-
- **Parameter Routes**: ~80 ns - Tree traversal + param extraction
20-
- **Nested Routes**: ~120 ns - Multiple segments with params
21-
- **No Match**: ~60 ns - Tree traversal without match
23+
- **Static Routes**: ~12 ns - Direct O(1) hash lookup
24+
- **Named Parameter**: ~80 ns - Tree traversal + param extraction
25+
- **Nested Parameter**: ~123 ns - Multiple segments with params
26+
- **Regex Parameter**: ~297 ns - Tree traversal + RegExp validation
27+
- **Single Wildcard**: ~116 ns - Tree traversal with wildcard match
28+
- **Catch-all Globstar**: ~151 ns - Deep path with globstar capture
29+
- **Any-method**: ~23 ns - Static cache hit with fallback method
30+
- **Without Params**: ~80 ns - Param route skipping extraction
31+
- **No Match**: ~65 ns - Tree traversal without match
2232

2333
## Running Benchmarks
2434

bench/router.bench.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ fastRouter.add('GET', '/users/:id/posts/:postId', { handler: 'getPost', method:
1010
fastRouter.add('GET', '/posts/:category/*', { handler: 'posts', method: 'GET' })
1111
fastRouter.add('GET', '/files/**', { handler: 'files', method: 'GET' })
1212
fastRouter.add('GET', '/api/:version/*', { handler: 'api', method: 'GET' })
13+
fastRouter.add('GET', '/items/:id(\\d+)', { handler: 'getItem', method: 'GET' })
14+
fastRouter.add('POST', '/users', { handler: 'createUser', method: 'POST' })
15+
fastRouter.add('', '/health', { handler: 'health', method: 'ANY' })
1316

1417
Deno.bench({
1518
name: 'Fast-Router: Static route lookup',
@@ -32,6 +35,41 @@ Deno.bench({
3235
}
3336
})
3437

38+
Deno.bench({
39+
name: 'Fast-Router: Regex parameter route',
40+
fn: () => {
41+
fastRouter.find('GET', '/items/42')
42+
}
43+
})
44+
45+
Deno.bench({
46+
name: 'Fast-Router: Single wildcard route',
47+
fn: () => {
48+
fastRouter.find('GET', '/posts/tech/latest')
49+
}
50+
})
51+
52+
Deno.bench({
53+
name: 'Fast-Router: Catch-all globstar route',
54+
fn: () => {
55+
fastRouter.find('GET', '/files/docs/2024/report.pdf')
56+
}
57+
})
58+
59+
Deno.bench({
60+
name: 'Fast-Router: Any-method matching',
61+
fn: () => {
62+
fastRouter.find('DELETE', '/health')
63+
}
64+
})
65+
66+
Deno.bench({
67+
name: 'Fast-Router: Lookup without params',
68+
fn: () => {
69+
fastRouter.find('GET', '/users/123', { params: false })
70+
}
71+
})
72+
3573
Deno.bench({
3674
name: 'Fast-Router: No match route',
3775
fn: () => {

0 commit comments

Comments
 (0)