Production

Performance

Benchmark surfaces and local result boundaries.

Performance

Nidus aims to keep the framework layer visible and measurable instead of hiding cost behind broad throughput claims. The benchmark suite is intentionally split into dependency resolution, routing composition, and request lifecycle targets so changes can be compared at the right boundary.

Run the full local benchmark surface with:

cargo bench --bench dependency_resolution
cargo bench --bench routing
cargo bench --bench request_lifecycle

For a quick smoke run with reduced Criterion sampling:

cargo bench --bench dependency_resolution -- --warm-up-time 0.1 --measurement-time 0.2 --sample-size 10
cargo bench --bench routing -- --warm-up-time 0.1 --measurement-time 0.2 --sample-size 10
cargo bench --bench request_lifecycle -- --warm-up-time 0.1 --measurement-time 0.2 --sample-size 10

Coverage

The current benchmark surface covers:

  • singleton dependency resolution
  • raw Axum route composition
  • Nidus controller route composition
  • raw Axum baseline request handling
  • hello-world request handling and app construction
  • controller plus injected service request handling and app construction
  • controller setup
  • guard middleware
  • validation extraction
  • request-scoped dependency resolution through HTTP
  • per-layer middleware: security headers, body limit, legacy request ID,
  • validated request ID, request context, error envelope, and timeout response

  • production default stack with and without in-process metrics
  • Prometheus metrics record-response, record-error, and render-text paths

The request lifecycle benchmark includes equivalent raw Axum request and routing composition baselines where they are meaningful. Other rows are microbenchmarks for specific framework behavior and should be compared to their own history.

Local Results

These numbers are one local validation run, not a universal performance claim. They were captured on 2026-06-25 at commit 4d19496 with cargo bench, rustc 1.96.0 (ac68faa20 2026-05-25), aarch64-apple-darwin, and macOS 14.5 (23F79) on arm64 hardware. Criterion reported several outliers and mixed regressions/improvements versus local saved history, including raw or unrelated benchmarks moving in different directions. Treat the table as a current reference point, not publish-grade proof.

The latest durable local result artifacts are:

  • benchmarks/results/2026-06-27-dependency-resolution-wave46.md
  • benchmarks/results/2026-06-27-routing-wave46.md
  • benchmarks/results/2026-06-27-request-lifecycle-wave43.md

Prefer those artifacts for current local benchmark evidence. The table below remains a compact reference that mixes the original full-table capture with later follow-up runs.

BenchmarkCentral estimateNotes
Nidus singleton dependency resolution24.944 nsdirect container lookup
raw Axum route composition1.9600 uscomposition baseline
Nidus controller route composition5.7504 uscontroller route builder path
raw Axum baseline request688.30 nsrequest baseline
Nidus hello-world request716.20 nssimple controller request
Nidus hello-world app3.2809 usapp construction microbenchmark
Nidus controller + service request777.87 nsinjected service route
Nidus controller + service app3.6975 usapp construction with DI setup
Nidus controller setup267.71 nscontroller builder setup
Nidus guarded route1.1572 usauthorization guard layer
Nidus validation route2.3850 usvalidation extractor path
Nidus request-scoped route1.5848 usrequest-scoped provider resolution
Nidus middleware security headers request1.1748 usresponse header layer
Nidus middleware body limit request858.22 nsdeclared Content-Length check
Nidus middleware legacy request ID request1.4592 usWave 28 follow-up run; legacy generated UUID layer
Nidus middleware validated request ID request1.6663 usstrict UUID request ID layer
Nidus middleware request context request1.3570 usrequest context layer
Nidus middleware error envelope success request1.0651 ussuccess path through envelope layer
Nidus middleware timeout response request982.22 nsnon-timeout success path
Nidus API defaults production request3.4495 usproduction stack without metrics
Nidus API defaults production with metrics request4.2138 usproduction stack with metrics hook
Nidus metrics record response243.52 nsin-process Prometheus collector
Nidus metrics record inner error292.54 nserror path recording
Nidus metrics render text53.494 usrenders 10 routes with 100 samples each

Reading Results

Default request handling does not resolve the dependency graph per request. Request-scoped providers, validation, guards, production defaults, and metrics are opt-in layers with measurable costs. The in-process Prometheus collector is useful for examples, local services, and tests, but high-cardinality route labels increase render output and memory use; prefer stable route patterns such as /users/{id} over concrete IDs.

Before publishing performance claims, rerun these benchmarks on the release machine, include equivalent raw Axum baselines where relevant, preserve Criterion output, and report noise, outliers, and tradeoffs directly.