trillium
Emerging · Rust · engine: trillium-http · standard configuration · completeness 4/4
Trillium 1.x async Rust web framework on tokio. trillium-rustls for TLS (h1 + h2 via ALPN), trillium-quinn for HTTP/3, trillium-websockets for /ws, trillium-static for /static/* served from disk per request, trillium-compression middleware for runtime gzip/brotli, trillium-api for JSON handlers, trillium-grpc for the benchmark.BenchmarkService gRPC endpoints, deadpool-postgres for async-db and crud.
Achievements
🥈 1 Silver · 🥉 4 Bronze. Top three of a field, taken in this entry's own league: the family composite, the same composite among entries written in the same language, and each test profile it is scored on. Every field is the one the badges publish, so a medal and a badge always say the same thing. How medals are awarded.
| Medal | Award | Field | Rank |
|---|---|---|---|
| 🥈 Silver | Test profile | Gateway · Gateway (H3) | 2 of 3 |
| 🥉 Bronze | Family composite | Composite · Gateway | 3 of 4 |
| 🥉 Bronze | Family composite | Composite · HTTP/3 | 3 of 7 |
| 🥉 Bronze | Within its language | Rust · HTTP/2 | 3 of 4 |
| 🥉 Bronze | Test profile | HTTP/3 · Static | 3 of 7 |
Composite rank
Each profile of a family is worth 100 to the entry that leads it, and the composite is the sum over the family, less 2.5% for each of routing, middleware, request and response the entry does not do for you - its completeness factor, which the WebSocket and gRPC families do not carry. The field is this entry's own league: engines and reverse proxies are scored apart from frameworks. How it works.
| Family | Rank | Composite |
|---|---|---|
| HTTP/1.1 | 20 of 71 | 3261 |
| HTTP/2 | 9 of 18 | 734 |
| HTTP/3 | 3 of 7 | 855 |
| Gateway | 3 of 4 | 1238 |
| gRPC | 4 of 4 | 377 |
| WebSocket | 12 of 15 | 397 |
Every result
Alpha Round, 41 runs. Requests per second is the best of three; latency, CPU and memory come from that run.
| Category | Profile | Conns | Req/sec | Avg | p99 | CPU | Memory |
|---|---|---|---|---|---|---|---|
| Connection | Baseline | 4,096 | 598,479 | 2.81ms | 9.29ms | 5941.7% | 200MiB |
| Connection | Pipelined | 4,096 | 2,967,565 | 9.96ms | 42.90ms | 6374.3% | 186MiB |
| Connection | Short-lived | 4,096 | 498,089 | 1.12ms | 2.28ms | 2354.3% | 208MiB |
| Concurrency | Async Delay | 32,000 | 419,972 | 58.83ms | 85.40ms | 3523.8% | 1.4GiB |
| Efficiency | Latency-10K | 1,024 | 9,936 | 66.8us | 107.0us | 24.9% | 152MiB |
| Efficiency | Latency-1M | 1,024 | 589,964 | 3457062.5us | 7366656.0us | 6085.5% | 138MiB |
| Efficiency | Latency-500K/8 | 1,024 | 291,486 | 3453795.3us | 7378944.0us | 768.2% | 78MiB |
| Workload | JSON Comp | 4,096 | 116,284 | 7.82ms | 25.40ms | 6204.1% | 775MiB |
| Workload | JSON Comp | 16,384 | 112,843 | 9.45ms | 33.70ms | 6026.1% | 752MiB |
| Workload | JSON TLS | 4,096 | 597,353 | 5.75ms | 33.80ms | 6279.4% | 428MiB |
| Workload | 8Gbit | 512 | 49,089 | 102.5us | 147.0us | 255.7% | 240MiB |
| Workload | Static TLS | 1,024 | 554,526 | 1.84ms | 20.79ms | 6463.5% | 529MiB |
| Database | Async DB | 1,024 | 211,005 | 3.95ms | 6.09ms | 3153.2% | 238MiB |
| Database | Fortunes | 1,024 | 198,913 | 4.19ms | 6.56ms | 5015.6% | 318MiB |
| HTTP/2 | Baseline | 256 | 1,136,707 | 21.20ms | 101.83ms | 5363.6% | 876MiB |
| HTTP/2 | Baseline | 1,024 | 1,132,115 | 56.33ms | 513.17ms | 5540.1% | 2.8GiB |
| HTTP/2 | Static | 256 | 21,679 | 344.50ms | 1.09s | 2696.5% | 1.9GiB |
| HTTP/2 | Static | 1,024 | 18,419 | 975.86ms | 3.12s | 3934.4% | 3.0GiB |
| HTTP/2 | Baseline (h2c) | 256 | 1,162,136 | 21.32ms | 234.61ms | 5319.0% | 845MiB |
| HTTP/2 | Baseline (h2c) | 1,024 | 1,275,958 | 51.42ms | 524.74ms | 5510.8% | 2.3GiB |
| HTTP/2 | Baseline (h2c) | 4,096 | 1,120,404 | 118.28ms | 1.67s | 5491.3% | 6.5GiB |
| HTTP/2 | JSON (h2c) | 1,024 | 980,773 | 24.71ms | 957.04ms | 5671.9% | 1.5GiB |
| HTTP/2 | JSON (h2c) | 4,096 | 904,958 | 77.81ms | 3.96s | 5694.3% | 5.1GiB |
| HTTP/3 | Baseline | 64 | 419,555 | 10.66ms | 153.56ms | 2431.4% | 290MiB |
| HTTP/3 | Static | 64 | 212,268 | 12.04ms | 123.08ms | 2492.8% | 616MiB |
| gRPC | Unary | 256 | 743,430 | 34.26ms | 158.45ms | 5419.6% | 437MiB |
| gRPC | Unary | 1,024 | 699,286 | 98.89ms | 905.71ms | 5603.2% | 1.3GiB |
| gRPC | Unary TLS | 256 | 725,040 | 34.53ms | 94.49ms | 5305.1% | 424MiB |
| gRPC | Unary TLS | 1,024 | 644,817 | 112.30ms | 771.08ms | 5570.0% | 1.4GiB |
| Gateway | Gateway (H2) | 512 | 82,147 | 183.66ms | 2.67s | 5384.2% | 2.9GiB |
| Gateway | Gateway (H2) | 1,024 | 77,223 | 373.15ms | 4.31s | 5062.8% | 5.3GiB |
| Gateway | Gateway (H3) | 64 | 83,423 | 24.41ms | 89.75ms | 4076.1% | 913MiB |
| Gateway | Gateway (H3) | 256 | 61,706 | 128.98ms | 796.15ms | 2818.9% | 2.4GiB |
| WebSocket | Echo | 512 | 441,414 | 1.09ms | 2.47ms | 3011.7% | 329MiB |
| WebSocket | Echo | 4,096 | 353,994 | 4.13ms | 10.90ms | 3975.2% | 571MiB |
| WebSocket | Echo | 16,384 | 349,988 | 4.91ms | 12.70ms | 3444.1% | 729MiB |
| WebSocket | Echo Pipelined | 512 | 9,125,228 | 834us | 2.04ms | 3597.1% | 350MiB |
| WebSocket | Echo Pipelined | 4,096 | 7,903,078 | 3.48ms | 10.10ms | 4303.6% | 688MiB |
| WebSocket | Echo Pipelined | 16,384 | 7,477,872 | 5.11ms | 12.40ms | 3630.8% | 983MiB |
| WebSocket | Echo Short-lived | 512 | 269,740 | 746us | 1.67ms | 2848.8% | 476MiB |
| WebSocket | Echo Short-lived | 4,096 | 272,534 | 797us | 1.83ms | 2895.8% | 542MiB |
Compared with
The Rust entries around trillium on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs trillium | |
|---|---|---|---|
| actix | 6880 | +111% | head to head |
| tokio-uring | 3462 | +6% | head to head |
| hyper | 3345 | +3% | head to head |
| trillium-tuned | 3197 | -2% | head to head |
| rocket | 3112 | -5% | head to head |
Compare trillium with any Rust entry · Compare trillium with any entry, in any language · Every Rust entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry