Summary
Urus RPS
53–54k
Consistent s1–s4
Axum RPS
288–320k
Consistent s1–s4
Performance Gap
5.7×
Axum faster (RPS)
Results
| Framework | Scenario | Sustained RPS | p99 Latency | Description |
|---|---|---|---|---|
| Urus | S1 | 54,640 | 2.70ms | Bare HTTP |
| Urus | S2 | 53,139 | 2.62ms | + Middleware (logger, auth, router) |
| Urus | S3 | 53,616 | 2.67ms | + In-memory store (mixed workload) |
| Urus | S4 | 52,590 | 2.53ms | + SQLite (1 writer, 4 readers) |
| Axum | S1 | 288,330 | 11.64ms | Bare HTTP |
| Axum | S2 | 315,596 | 49.66ms | + Middleware (logger, auth, router) |
| Axum | S3 | 316,342 | 60.45ms | + In-memory store (mixed workload) |
| Axum | S4 | 320,150 | 56.13ms | + SQLite (sqlx::SqlitePool) |
Spec Compliance
Target: Urus RPS ≥ 50% of Axum ("within 2×") on S1 and S2.
| Scenario | Urus RPS | Axum RPS | Ratio | Status |
|---|---|---|---|---|
| S1 | 54,640 | 288,330 | 0.19 (5.3×) | FAIL |
| S2 | 53,139 | 315,596 | 0.17 (5.9×) | FAIL |
| S3 | 53,616 | 316,342 | 0.17 (5.9×) | FAIL |
Observations
- Consistent Gap: Axum is 5.3–5.9× faster across all scenarios. The gap does not narrow with additional complexity.
- No Performance Collapse: Both frameworks maintain stable RPS from S1 to S4. Urus holds 52.6–54.6k RPS; Axum holds 288–320k RPS. SQLite does not degrade either one.
- Tail Latency Pattern: Axum's p99 rises with load (11.6ms → 60.5ms). Urus remains sub-3ms across all scenarios. This is typical of async Rust under concurrent load vs. actor-based systems (BEAM behavior).
Analysis
RPS Shortfall
- Urus fails the 2× target by 3.3–5.9×. This is the primary result.
- The gap stems from Urus's message-passing model: each request is routed through actor channels, adding per-request overhead vs. Axum's direct memory access and async scheduling.
- This is a fundamental architectural difference, not an optimization opportunity.
Tail Latency Observation
- Urus exhibits sub-3ms p99 under all loads. Axum's p99 grows linearly with concurrency (11–60ms). This mirrors known BEAM vs. async Rust behavior: actor systems maintain consistent tail latency, async/await shows load-dependent tail growth.
- This is notable but not a spec redemption. Both metrics matter. Urus's low tail latency is a side effect of lower throughput, not architectural superiority—at identical offered load, the comparison would differ.
- For workloads with strict tail-latency SLAs and modest throughput needs, Urus's profile could be preferable. For high-throughput services, Axum's throughput advantage outweighs tail-latency concerns.
Conclusion
Urus does not meet the spec target of "within 2× of Axum RPS." It is 5.3–5.9× slower. This gap is consistent across all scenarios.
Verdict: FAIL on throughput (primary benchmark metric). Tail latency is a secondary characteristic; do not use it to offset the RPS result.