Summary
+Urus RPS
+Consistent s1–s4
+Axum RPS
+Consistent s1–s4
+Performance Gap
+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. +
+