2.5 KiB
HTTP performance baselines
These numbers are regression controls, not cross-machine promises. They were measured on
2026-08-13 under Linux 6.12/KVM, six exposed cores of an AMD Ryzen 7 1700X, Temurin 21.0.11 and
JMH 1.37. CI uses short independent forks for allocation and sample latency so the sampling
harness does not contaminate gc.alloc.rate.norm.
Gated hot paths
| Benchmark | B/op | p50 ns | p99 ns | p999 ns | CI p99 ceiling ns |
|---|---|---|---|---|---|
| h1 parse and route | 0.022 | 540 | 33,472 | 60,822 | 45,000 |
| h2 pooled stream lifecycle | 0.010 | 530 | 2,138 | 37,724 | 2,900 |
| h2 response encoding | 0.004 | 210 | 993 | 14,626 | 1,350 |
| HPACK browser-request decode | 0.015 | 730 | 5,245 | 27,577 | 7,100 |
| HPACK typical-response encode | 0.003 | 180 | 620 | 12,025 | 850 |
| frame read/validate/discard | 0.006 | 70 | 1,999 | 90,508 | 2,700 |
The sub-byte allocation values occur with no collection and are JMH/GC-profiler rate normalization noise. The CI allocation ceiling is 0.05 B/op. A benchmark exceeding it fails; a baseline or ceiling change requires an explicit edit and justification here.
The table records the higher percentile observed across three consecutive controlled runs; this is important because short sample-mode runs on the shared KVM host showed visible scheduler noise. The p999 values expose those tails but are recorded rather than gated. The p99 ceilings are the worst observed p99 plus about 35% headroom.
HTTP/1 historical comparison
The plan required a pre-Phase-1 number, but no benchmark was committed at that point. Phase 17
reconstructed the current RequestPipelineBenchmark.parseAndRoute fixture against Phase 0 commit
db6e4a4 in a detached worktree and ran both revisions on the same host and JVM:
| Revision | ns/op | B/op |
|---|---|---|
Phase 0 (db6e4a4) |
976.195 ± 45.924 | 224.007 |
| Phase 17 | 1,024.602 ± 50.744 | 0.007 |
The hardened parser's mean is 5.0% higher and removes effectively all 224 B/op. The 99.9%
confidence intervals overlap (930.271–1,022.120 ns for Phase 0 and 973.858–1,075.345 ns for
Phase 17), so this run does not establish a statistically significant latency regression. This is
an honest reconstruction, not a claim that an absent historical run existed. Phase 17 recovered
about 4.5% by having RequestParser populate Http1HeaderMap's zero-copy index during the same
validated header pass instead of rescanning every line; all security checks remain in that path.