9.0.2 → 9.1.0 · validated core comparison
Measure the paths that changed.
Nine alternating samples compare the exact 9.0.2 Git tag with the 9.1.0 working tree across request parsing, routing, hooks, file ranges, Brotli, Config allocation, and listener closure.
Recorded medians
Targeted work per second and retained memory.
These medians come from one recorded environment. Each row keeps its nine raw baseline and candidate samples in the linked JSON.
9Alternating samples
Node 24.18.0Runtime
Windows x64Platform
Core Ultra 9 275HXProcessor
| Workload | 9.0.2 median | 9.1.0 median | Result | Primary change |
|---|---|---|---|---|
| 1,000 repeated query values | 1,076 req/s | 7,695 req/s | 7.15× speedup | In-place array accumulation. |
| 1,000-domain virtual-host miss | 13,926 req/s | 23,259 req/s | 1.67× speedup | Compiled O(1) hostname map. |
| 1,000-domain virtual-host hit | 4,173 req/s | 4,198 req/s | 1.01× speedup | Hostname map plus canonical-root reuse. |
| 16-byte custom-hook range from 8 MiB | 790 req/s | 2,310 req/s | 2.92× speedup | Exact selected-byte read. |
| Default Brotli for 2.5 MiB structured text | 0.580 req/s | 112.267 req/s | 193.56× speedup | Validated default quality 4; 161,802 → 270,759 compressed bytes. |
| 100,000 cold Config constructions | 201,737 instances/s | 580,412 instances/s | 2.88× speedup | Deferred MIME-map materialization. |
| 10,000 cold Configs retained | 11,816.5 B/instance | 5,786.0 B/instance | 51.0% lower | Deferred per-instance MIME map. |
| Immediate deploy + close | 180 leaked listeners | 0 leaked listeners | 180 → 0 | Pending listeners close cleanly. |
Ratio meaning: each displayed ratio is the magnitude of change; its speedup, slowdown, reduction, or increase label states the direction. The listener row reports the correctness count across 180 recorded cycles per source.
Compatibility and representative paths
Read the optimized paths beside their controls.
| Workload | 9.0.2 median | 9.1.0 median | Result | Contract |
|---|---|---|---|---|
| Default-hook static GET | 4,055 req/s | 4,254 req/s | 1.05× speedup | Exact static response through the normal route. |
| Bodyless static HEAD | 10,981 req/s | 13,739 req/s | 1.25× speedup | GET metadata with an empty wire body. |
| Bodyless custom request hook | 16,698 req/s | 16,507 req/s | 1.01× slowdown | Empty string and Buffer body contract. |
| Default-hook HEAD for 8 MiB | 5,254 req/s | 5,884 req/s | 1.12× speedup | Full metadata and an empty wire body through the bodyless path. |
| Custom beforeServe HEAD | 765 req/s | 688 req/s | 1.11× slowdown | The hook receives the full 8 MiB representation; the wire body stays empty. |
| Brotli quality 11 | 0.584 req/s | 0.581 req/s | 1.01× slowdown | server.brotliQuality:11 preserves the high-quality option through Node's built-in node:zlib; runtime dependencies stay at zero. |
| Cold one-key MIME overlays retained | 11,818.6 B/instance | 5,972.4 B/instance | 49.5% lower | Overlays stay deferred and instance-isolated. |
| Materialized MIME maps retained | 11,816.7 B/instance | 12,018.8 B/instance | 1.7% higher | Reading contentType creates the ordinary isolated map. |
The two 8 MiB HEAD rows quantify the full-representation compatibility cost for custom hooks. The materialized Config row quantifies the point where deferred state becomes the complete per-instance MIME map.
Workload contracts
Every timed path proves its output.
| Area | Standard profile | Acceptance contract |
|---|---|---|
| HTTP | 400 small requests, 40 repeated-query requests, 8 large-file requests, or 2 Brotli requests per sample; 10 clients. | Status, headers, body bytes, decompressed bytes, and response counts. |
| Query | 1,000 ordered values assigned to one key. | Array length, first value, and last value. |
| Routing | 1,000 mixed-case domains with an accepted Host and an unknown Host. | Selected root returns exact bytes; miss returns 421. |
| Range hook | 16 bytes selected from the middle of an 8 MiB file. | Hook sees 16 bytes, transforms them, preserves 206/Content-Range, and runs afterServe once. |
| Config | 100,000 constructions or 10,000 retained instances in fresh garbage-collected workers. | Default checksum, key order, own MIME entries, mutation isolation, and false-to-overlay restoration. |
| Lifecycle | 20 deploy-on-port-zero plus immediate-close cycles per sample. | Live listener and ready-callback counts after close. |
Comparison method
Keep order, processes, and evidence explicit.
| Method | Implementation |
|---|---|
| Exact baseline | Exports Server.js, Config.js, and MimeTypes.js from Git tag 9.0.2 into an OS temporary directory. |
| Alternating order | Each sample alternates baseline-first and candidate-first execution. |
| Process isolation | HTTP variants use separate server processes. Config memory and lifecycle use fresh --expose-gc workers. |
| Recorded boundary | Fixture creation, startup, response preflight, warmup, worker startup, and cleanup occur outside action timing. |
| Aggregation | Median, minimum, maximum, and all nine raw samples are retained. |
| Source identity | Git ref, commit, working-tree state, source hashes, and benchmark-harness hashes identify the complete comparison. |
| Environment | Node, V8, platform, OS release, architecture, processor, logical cores, and total memory are recorded. |
Interpretation: compare ratios within the recorded workload and environment. Run the same profile on deployment-class hardware when capacity planning needs host-specific numbers.
Reproduce
Run the exact source comparison.
shell · repository checkout with tag 9.0.2
npm run benchmark:core
node --expose-gc benchmark/core.js \
--output site/benchmarks/core-9.0.2-vs-9.1.0.json| File | Role |
|---|---|
benchmark/core.js | Exports the baseline, creates fixtures, alternates samples, validates results, and writes JSON. |
benchmark/core-server.js | Runs one source variant and exposes the hook scenarios through IPC. |
benchmark/core-worker.js | Measures Config construction/memory and immediate-close correctness in fresh processes. |
site/benchmarks/core-9.0.2-vs-9.1.0.json | Published environment, configuration, summaries, source hashes, and raw samples. |