ioxide
Engine · C# · engine: io_uring
ioxide — a shared-nothing io_uring runtime for .NET, consumed as its published NuGet packages (ioxide, ioxide.pg, ioxide.timer, ioxide.file, ioxide.http2, ioxide.ngtcp2, ioxide.nghttp3). One ring per reactor thread: multishot accept/recv into provided buffer rings, inline IValueTaskSource continuations, raw-syscall io_uring (no liburing). The HTTP/1.1 handler (request line, headers, Content-Length + chunked bodies, keep-alive, pipelining, fragmented reads) is hand-written on the raw recv/send API; TLS terminates ring-natively (kTLS transmit offload, OpenSSL receive) on :8081, h2 over TLS (pure-C# ioxide.http2) on :8443, and HTTP/3 over QUIC (ngtcp2 + nghttp3) on udp:8443; async-db rides ioxide.pg's ring-native pooled Postgres driver (SCRAM-SHA-256), static on h1 reads the file descriptor straight into the connection's write slab (ioxide.file hands out descriptors, not bytes), so header and body leave in one flush with no intermediate buffer; h2/h3 serve the same assets from memory.
Achievements
🥇 1 Gold · 🥈 3 Silver · 🥉 6 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 | Test profile | Concurrency · Async Delay | 1 of 6 |
| 🥈 Silver | Family composite | Composite · HTTP/3 | 2 of 5 |
| 🥈 Silver | Test profile | HTTP/3 · Baseline | 2 of 5 |
| 🥈 Silver | Test profile | HTTP/3 · Static | 2 of 5 |
| 🥉 Bronze | Family composite | Composite · HTTP/1.1 | 3 of 26 |
| 🥉 Bronze | Family composite | Composite · HTTP/2 | 3 of 7 |
| 🥉 Bronze | Within its language | C# · HTTP/1.1 | 3 of 7 |
| 🥉 Bronze | Test profile | HTTP/2 · Baseline | 3 of 7 |
| 🥉 Bronze | Test profile | HTTP/2 · Static | 3 of 7 |
| 🥉 Bronze | Test profile | Workload · JSON TLS | 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 | 3 of 26 | 5777 |
| HTTP/2 | 3 of 7 | 1411 |
| HTTP/3 | 2 of 5 | 1325 |
Every result
Alpha Round, 18 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,111,381 | 996us | 1.44ms | 6443.2% | 342MiB |
| Connection | Pipelined | 4,096 | 53,376,982 | 1.23ms | 1.79ms | 6125.7% | 343MiB |
| Connection | Short-lived | 4,096 | 2,543,314 | 1.49ms | 4.47ms | 5529.3% | 468MiB |
| Concurrency | Async Delay | 32,000 | 2,782,554 | 11.42ms | 14.60ms | 6074.0% | 1.1GiB |
| Efficiency | Latency-10K | 1,024 | 9,980 | 68.7us | 99.0us | 21.7% | 273MiB |
| Efficiency | Latency-1M | 1,024 | 997,708 | 91.0us | 163.0us | 2184.6% | 243MiB |
| Efficiency | Latency-500K/8 | 1,024 | 498,864 | 875.7us | 9228.0us | 776.9% | 113MiB |
| Workload | JSON Comp | 4,096 | 901,372 | 4.50ms | 21.30ms | 6125.5% | 1.5GiB |
| Workload | JSON Comp | 16,384 | 895,348 | 18.12ms | 54.50ms | 6075.5% | 4.7GiB |
| Workload | JSON TLS | 4,096 | 1,803,723 | 2.18ms | 69.72ms | 6297.0% | 1.1GiB |
| Workload | Static TLS | 1,024 | 1,120,816 | 848.25us | 46.10ms | 6289.5% | 502MiB |
| Database | Async DB | 1,024 | 358,610 | 2.18ms | 15.90ms | 3002.8% | 435MiB |
| HTTP/2 | Baseline | 256 | 10,337,519 | 1.99ms | 12.26ms | 4289.5% | 461MiB |
| HTTP/2 | Baseline | 1,024 | 12,235,767 | 6.81ms | 97.32ms | 5118.7% | 727MiB |
| HTTP/2 | Static | 256 | 1,129,754 | 7.45ms | 47.53ms | 5648.8% | 580MiB |
| HTTP/2 | Static | 1,024 | 950,009 | 33.15ms | 159.44ms | 5958.2% | 1.4GiB |
| HTTP/3 | Baseline | 64 | 3,711,830 | 1.18ms | 2.93ms | 3190.2% | 277MiB |
| HTTP/3 | Static | 64 | 545,922 | 8.33ms | 19.39ms | 3496.3% | 675MiB |
Compared with
The C# entries around ioxide on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs ioxide | |
|---|---|---|---|
| genhttp-ioxide | 7089 | +23% | head to head |
| ioxide-pipes | 6448 | +12% | head to head |
| simplew-tuned | 6096 | +6% | head to head |
| genhttp | 4965 | -14% | head to head |
| simplew | 4347 | -25% | head to head |
Compare ioxide with any C# entry · Compare ioxide with any entry, in any language · Every C# entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry