plod
Experimental · Goose · engine: goose-http · standard configuration · completeness 4/4
Plod: a REST framework for Goose, a memory-safe systems language with no heap allocator or garbage collector, with routes, scopes, middleware, and extractors in the manner of Actix, over goose-http's io_uring loop, one worker per CPU. JSON is serialized per request with plod::format_fields, through Goose's standard json writer, and compressed through plod::compressed at default levels; static files come from disk through plod::files, with their .br and .gz siblings; /async-db runs on goose-postgres's async pool, and production-stack's cache-aside is in process. HTTP/3 is goose-http's own QUIC, written in Goose over goose-tls's handshake and libcrypto's packet protection, with QPACK's static table, on UDP 8443 beside h2. The gateway profiles put stock nginx in front of it, with nginx's own HTTP/3 for gateway-h3.
Achievements
🥇 5 Gold · 🥈 5 Silver · 🥉 3 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 |
|---|---|---|---|
| 🥇 Gold | Family composite | Composite · HTTP/2 | 1 of 10 |
| 🥇 Gold | Family composite | Composite · HTTP/3 | 1 of 7 |
| 🥇 Gold | Test profile | HTTP/2 · JSON (h2c) | 1 of 10 |
| 🥇 Gold | Test profile | HTTP/3 · Baseline | 1 of 7 |
| 🥇 Gold | Test profile | HTTP/3 · Static | 1 of 6 |
| 🥈 Silver | Test profile | HTTP/2 · Baseline | 2 of 9 |
| 🥈 Silver | Test profile | HTTP/2 · Baseline (h2c) | 2 of 10 |
| 🥈 Silver | Test profile | HTTP/2 · Static | 2 of 9 |
| 🥈 Silver | Test profile | WebSocket · Echo Short-lived | 2 of 14 |
| 🥈 Silver | Test profile | Workload · JSON TLS | 2 of 18 |
| 🥉 Bronze | Family composite | Composite · WebSocket | 3 of 14 |
| 🥉 Bronze | Test profile | WebSocket · Echo | 3 of 14 |
| 🥉 Bronze | Test profile | WebSocket · Echo Pipelined | 3 of 14 |
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 | 4 of 19 | 7331 |
| HTTP/2 | 1 of 10 | 3801 |
| HTTP/3 | 1 of 7 | 2000 |
| Gateway | 1 of 2 | 3000 |
| WebSocket | 3 of 14 | 2919 |
Every result
Alpha Round, 38 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 | 4,015,781 | 1.02ms | 1.42ms | 6190.3% | 215MiB |
| Connection | Pipelined | 4,096 | 32,476,582 | 2.02ms | 2.85ms | 6215.7% | 216MiB |
| Connection | Short-lived | 4,096 | 2,676,237 | 1.40ms | 2.13ms | 5626.2% | 215MiB |
| Concurrency | Async Delay | 32,000 | 1,954,150 | 16.27ms | 20.90ms | 3516.6% | 386MiB |
| Efficiency | Latency-10K | 1,024 | 9,981 | 70.4us | 99.0us | 22.6% | 168MiB |
| Efficiency | Latency-1M | 1,024 | 997,965 | 96.8us | 169.0us | 2305.4% | 171MiB |
| Efficiency | Latency-500K/8 | 1,024 | 498,851 | 356.6us | 5270.0us | 807.9% | 38MiB |
| Workload | JSON Comp | 4,096 | 936,707 | 4.33ms | 10.00ms | 6668.0% | 362MiB |
| Workload | JSON Comp | 16,384 | 915,885 | 17.82ms | 35.60ms | 6174.5% | 498MiB |
| Workload | JSON TLS | 4,096 | 1,792,185 | 1.46ms | 51.78ms | 5448.5% | 252MiB |
| Workload | 8Gbit | 512 | 49,213 | 90.4us | 115.0us | 195.4% | 182MiB |
| Workload | Static TLS | 1,024 | 918,166 | 1.06ms | 16.71ms | 6434.0% | 271MiB |
| Database | Async DB | 1,024 | 352,767 | 2.26ms | 16.70ms | 3315.6% | 186MiB |
| HTTP/2 | Baseline | 256 | 14,536,938 | 939us | 12.67ms | 3034.4% | 189MiB |
| HTTP/2 | Baseline | 1,024 | 13,907,544 | 3.69ms | 93.85ms | 2921.9% | 216MiB |
| HTTP/2 | Static | 256 | 938,115 | 8.60ms | 75.15ms | 6426.1% | 352MiB |
| HTTP/2 | Static | 1,024 | 915,111 | 33.92ms | 223.31ms | 6137.4% | 537MiB |
| HTTP/2 | Baseline (h2c) | 256 | 14,750,298 | 895us | 5.58ms | 2885.4% | 182MiB |
| HTTP/2 | Baseline (h2c) | 1,024 | 14,427,041 | 3.47ms | 18.07ms | 2858.4% | 209MiB |
| HTTP/2 | Baseline (h2c) | 4,096 | 13,711,060 | 14.20ms | 55.67ms | 2713.2% | 297MiB |
| HTTP/2 | JSON (h2c) | 1,024 | 4,697,435 | 6.43ms | 36.87ms | 6051.6% | 247MiB |
| HTTP/2 | JSON (h2c) | 4,096 | 4,528,974 | 26.33ms | 89.76ms | 6144.1% | 388MiB |
| HTTP/3 | Baseline | 64 | 6,822,294 | 577us | 970us | 3614.2% | 188MiB |
| HTTP/3 | Static | 64 | 923,390 | 4.95ms | 10.56ms | 4450.2% | 276MiB |
| Gateway | Gateway (H2) | 512 | 314,162 | 51.36ms | 188.08ms | 4571.0% | 1.4GiB |
| Gateway | Gateway (H2) | 1,024 | 309,878 | 101.61ms | 311.88ms | 4635.9% | 1.7GiB |
| Gateway | Gateway (H3) | 64 | 197,061 | 12.32ms | 45.62ms | 3653.4% | 1.2GiB |
| Gateway | Gateway (H3) | 256 | 200,536 | 40.77ms | 174.33ms | 4007.4% | 1.6GiB |
| Gateway | Production Stack | 256 | 253,087 | 17.19ms | 78.11ms | 5138.7% | 1.2GiB |
| Gateway | Production Stack | 1,024 | 207,373 | 73.84ms | 3.44s | 4649.5% | 2.0GiB |
| WebSocket | Echo | 512 | 4,079,273 | 124us | 277us | 6268.9% | 164MiB |
| WebSocket | Echo | 4,096 | 4,252,815 | 959us | 1.26ms | 6059.4% | 201MiB |
| WebSocket | Echo | 16,384 | 3,940,776 | 4.13ms | 5.43ms | 6401.3% | 343MiB |
| WebSocket | Echo Pipelined | 512 | 61,548,716 | 132us | 279us | 6241.3% | 164MiB |
| WebSocket | Echo Pipelined | 4,096 | 63,398,316 | 1.03ms | 1.47ms | 6164.1% | 208MiB |
| WebSocket | Echo Pipelined | 16,384 | 59,072,310 | 4.40ms | 7.43ms | 5921.6% | 343MiB |
| WebSocket | Echo Short-lived | 512 | 2,149,052 | 125us | 416us | 5171.8% | 168MiB |
| WebSocket | Echo Short-lived | 4,096 | 2,566,976 | 1.05ms | 1.84ms | 5676.8% | 216MiB |
Compare plod with any entry, in any language · Every Goose entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry