# GitHub Action Benchmark
Generated by the benchmark workflow.
## Run
- Commit: 46852af6268b4a50dc583b9c0ef40c0c2d0496fe
- Ref: main
- Runner: Linux
- Throughput exit code: 0
- Comparison exit code: 0
- Concurrency exit code: 0
- Interop exit code: 0
- HTTP/3 exit code: 0
- Complexity exit code: 0
- Cross-machine exit code: not-configured
- Fuzz exit code: 0
- Workflow run: [37227732964](https://github.com/blueokanna/Courierust/actions/runs/37227732964)
## Evidence Rules
- Rows marked `invalid` are retained for auditability but are excluded from performance conclusions.
- The `*_h2c_large_body_to_hyper` rows measure a 1 MiB POST against the same hyper h2 server. Both clients are paced by the server 64 KiB initial flow-control window (WINDOW_UPDATE round trips), and reqwest retains a large fixed wait even in the async client — these rows are NOT valid for ratio claims.
- `quinn_h3_client_to_courierust` is reported `not_available` until the independent quinn+rustls QUIC/TLS handshake completes against the Courierust H3 server (a genuine interop gap, never faked).
- Loopback is not cross-machine evidence. The cross-machine table is evidence only when `target_scope=remote` and `status=ok`.
- TLS rows measure the built-in TLS 1.2/1.3 path; certificate, hostname, and ALPN checks must pass for the case to be valid. `negotiated_alpn` is reported; `session_resumption=n/a` because each TLSVERIFY row is a single handshake that does not measure resumption (the stack does implement TLS 1.3 session tickets).
- Fuzz status is evidence only for the recorded target, run count, and duration; an unconfigured target is not a pass.
- The `STATS` table is the reactor/connection/stream/syscall evidence behind the throughput rows (especially the h2 multi-worker scaling).
- The complexity tables are scaling evidence, not a speed claim: the class is fitted from the largest measured sizes, and the paired `ratio` is only meaningful within one run.
## Reading the numbers (correct interpretation)
- RPS and median latency are comparable only within a paired row (same client, server, payload, concurrency). Never divide across rows, clients or protocols to claim "N× faster".
- reqwest pays for a general async runtime, rich extensions (proxies, cookies, encodings, swappable connector/TLS backends) and a different pool policy: `pool_max_idle_per_host=N` caps idle *pooled* connections, not live ones — equivalent to Courierust `max_connections_per_host=N` only under sequential load.
- An H3 concurrent row whose P99/P99.9/tail_ratio sits far above its median (e.g. P99 jumping from ~200 µs to ms) is a signal to track, not noise. Candidates: UDP reactor, packet queue, congestion-window/ACK timers, QPACK/control flow, worker→reactor handoff, CI-runner scheduling. One run cannot localize the root cause, but it proves the H3 tail is not yet as tight as H2.
- The H1 server is built for event-driven protection (incomplete headers, idle keep-alive, slow senders); hyper is a mature async architecture. A short-request microbenchmark cannot dismiss the scheduling value — the concurrency/slow-connection rows measure production usability and resource isolation.
- H3 connection reuse plus cross-implementation interop (quinn+h3 → Courierust server) is stronger evidence than Courierust-to-Courierust.
## Throughput
| Case | Protocol | Mode | Payload | Workers | Server threads | Requests | RPS | Resp MB/s | P50 us | P75 us | P90 us | P95 us | P99 us | Min us | Mean us | Max us | Stddev us | P99.9 us | Tail | Samples |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| h1_sequential | h1 | sequential | empty | 1 | 4 | 4000 | 12330.0 | 0.000 | 81.55 | 84.68 | 88.36 | 90.37 | 95.14 | 51.26 | 81.72 | 141.53 | 6.02 | 108.08 | 1.17 | 2000 |
| h1_sequential | h1 | sequential | 1k | 1 | 4 | 4000 | 11668.4 | 11.948 | 86.26 | 87.96 | 89.61 | 90.72 | 104.28 | 55.13 | 85.54 | 119.39 | 5.37 | 111.38 | 1.21 | 2000 |
| h1_sequential | h1 | sequential | 64k | 1 | 4 | 4000 | 8766.9 | 574.546 | 113.56 | 119.02 | 126.17 | 127.61 | 137.56 | 88.89 | 113.69 | 176.42 | 9.23 | 162.72 | 1.21 | 2000 |
| h1_parallel_w1 | h1 | parallel | 1k | 1 | 4 | 4000 | 11637.8 | 11.917 | 85.79 | 87.76 | 92.08 | 97.17 | 107.58 | 28.27 | 85.68 | 122.91 | 7.16 | 117.90 | 1.25 | 2000 |
| h1_parallel_w4 | h1 | parallel | 1k | 4 | 4 | 4000 | 31090.5 | 31.837 | 107.91 | 142.02 | 177.23 | 203.81 | 268.93 | 30.11 | 117.89 | 488.25 | 47.81 | 438.54 | 2.49 | 2000 |
| h1_parallel_w8 | h1 | parallel | 1k | 8 | 8 | 4000 | 41445.2 | 42.440 | 146.29 | 211.42 | 298.58 | 365.52 | 498.52 | 26.35 | 169.65 | 881.35 | 101.37 | 808.71 | 3.41 | 2000 |
| h2_multiplex_w1 | h2c | multiplex | 1k | 1 | 4 | 4000 | 9844.3 | 10.081 | 103.03 | 105.41 | 111.79 | 118.37 | 122.39 | 70.05 | 102.13 | 171.08 | 8.35 | 134.12 | 1.19 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 1k | 8 | 4 | 4000 | 37523.7 | 38.424 | 194.94 | 241.59 | 285.45 | 314.35 | 347.48 | 95.27 | 209.27 | 380.80 | 51.32 | 369.24 | 1.78 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 1k | 32 | 4 | 4000 | 60174.1 | 61.618 | 502.74 | 522.85 | 567.10 | 727.42 | 966.00 | 199.93 | 523.75 | 1137.44 | 88.02 | 1100.84 | 1.92 | 2016 |
| h2_multiplex_w1 | h2c | multiplex | 64k | 1 | 4 | 4000 | 6510.4 | 426.665 | 151.31 | 159.50 | 162.94 | 165.47 | 181.53 | 121.72 | 153.62 | 392.37 | 10.82 | 234.36 | 1.20 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 64k | 8 | 4 | 4000 | 12012.1 | 787.222 | 660.26 | 726.15 | 828.85 | 925.43 | 1114.05 | 182.01 | 667.07 | 1363.61 | 144.82 | 1271.47 | 1.69 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 64k | 32 | 4 | 4000 | 19285.6 | 1263.899 | 1598.30 | 1742.03 | 1820.32 | 1977.32 | 2904.72 | 350.56 | 1657.99 | 4610.05 | 304.34 | 4164.24 | 1.82 | 2016 |
| https_h2_sequential | https+h2 | sequential | empty | 1 | 4 | 2000 | 9446.9 | 0.000 | 104.55 | 117.49 | 118.98 | 120.03 | 128.02 | 76.04 | 105.76 | 149.84 | 11.92 | 136.66 | 1.22 | 2000 |
| https_h2_sequential | https+h2 | sequential | 1k | 1 | 4 | 2000 | 9280.2 | 9.503 | 106.50 | 110.94 | 118.34 | 122.02 | 132.47 | 84.66 | 107.68 | 252.86 | 8.70 | 150.10 | 1.24 | 2000 |
| https_h2_sequential | https+h2 | sequential | 64k | 1 | 4 | 2000 | 1907.3 | 124.998 | 523.26 | 533.77 | 541.27 | 546.95 | 557.03 | 491.11 | 524.21 | 640.36 | 13.38 | 607.17 | 1.06 | 2000 |
## TLS Verification Evidence
| Protocol | Cert verified | Hostname verified | Negotiated ALPN | Session resumption | Cipher suite | Error |
| --- | --- | --- | --- | --- | --- | --- |
| https+h2 | true | true | h2 | n/a | 0x1303 | - |
| https+h2 | true | true | h2 | n/a | 0x1303 | - |
| https+h2 | true | true | h2 | n/a | 0x1303 | - |
## Cross-Library Comparison
| Case | Layer | Protocol | Client | Server | Payload | Workers | Server threads | Pool policy | Pool value | Reps | Status | Reason | Requests | RPS | Resp MB/s | P50 us | P75 us | P90 us | P95 us | P99 us | Min us | Mean us | Max us | Stddev us | P99.9 us | Tail | Samples |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| raw_tcp_floor | transport | h1 | std_tcp | std_tcp | 4b | 1 | 1 | raw_tcp | 1 | 1 | valid | - | 2000 | 23370.9 | 0.093 | 44.13 | 44.48 | 44.83 | 45.16 | 50.39 | 28.93 | 42.72 | 71.42 | 4.38 | 63.34 | 1.14 | 2000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 15779.7 | 16.158 | 60.47 | 75.17 | 77.00 | 77.87 | 82.18 | 27.36 | 63.28 | 122.66 | 9.91 | 91.20 | 1.36 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7784.4 | 7.971 | 118.44 | 144.89 | 147.28 | 150.67 | 248.82 | 86.33 | 128.37 | 584.32 | 27.18 | 334.14 | 2.10 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6313.6 | 6.465 | 159.67 | 164.04 | 167.65 | 171.29 | 179.25 | 120.42 | 158.31 | 226.94 | 9.23 | 208.25 | 1.12 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 8825.3 | 9.037 | 112.79 | 114.59 | 125.90 | 129.24 | 146.21 | 84.92 | 113.27 | 351.23 | 9.84 | 169.39 | 1.30 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 61894.7 | 63.380 | 111.54 | 152.15 | 187.44 | 212.96 | 312.04 | 37.16 | 122.10 | 2759.32 | 94.51 | 899.77 | 2.80 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 24203.3 | 24.784 | 328.05 | 350.31 | 373.48 | 395.96 | 522.39 | 101.03 | 326.09 | 1733.34 | 64.96 | 847.00 | 1.59 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 11196.8 | 733.795 | 83.18 | 100.98 | 102.30 | 103.33 | 115.17 | 62.26 | 89.24 | 150.76 | 11.74 | 127.28 | 1.38 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6636.5 | 434.928 | 153.69 | 165.45 | 167.39 | 169.14 | 184.77 | 111.05 | 150.62 | 235.86 | 17.19 | 196.07 | 1.20 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5570.9 | 365.096 | 180.13 | 186.80 | 189.70 | 193.92 | 205.21 | 137.98 | 179.44 | 304.56 | 10.83 | 230.85 | 1.14 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6681.8 | 437.898 | 151.29 | 165.41 | 167.99 | 169.57 | 180.24 | 105.71 | 149.61 | 289.46 | 16.46 | 221.17 | 1.19 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 8383.1 | 8.584 | 118.03 | 125.59 | 127.44 | 131.88 | 143.63 | 94.08 | 119.23 | 157.94 | 8.86 | 149.08 | 1.22 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6697.6 | 6.858 | 148.92 | 151.44 | 155.32 | 157.57 | 166.35 | 122.12 | 149.21 | 208.33 | 5.92 | 193.95 | 1.12 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7422.5 | 7.601 | 134.07 | 136.52 | 140.26 | 142.42 | 152.86 | 107.38 | 134.62 | 527.95 | 9.47 | 195.58 | 1.14 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6612.5 | 6.771 | 150.20 | 153.45 | 157.27 | 159.47 | 172.48 | 117.60 | 151.12 | 620.23 | 15.00 | 373.87 | 1.15 | 4000 |
| courierust_h2_conn1xw32 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 39423.7 | 40.370 | 761.37 | 891.37 | 1041.77 | 1136.10 | 1402.39 | 126.42 | 776.36 | 2110.83 | 213.74 | 1779.15 | 1.84 | 4000 |
| courierust_h2_conn4xw8 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 4 | 2 | valid | - | 4000 | 46782.1 | 47.905 | 586.00 | 792.72 | 997.63 | 1146.34 | 1524.79 | 76.34 | 626.31 | 2492.04 | 293.32 | 2106.55 | 2.60 | 4000 |
| courierust_h2_conn8xw4 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 43130.5 | 44.166 | 627.51 | 847.07 | 1063.39 | 1234.34 | 1713.79 | 71.35 | 671.98 | 3414.48 | 329.18 | 2798.49 | 2.73 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 31669.2 | 32.429 | 232.61 | 292.82 | 363.33 | 422.99 | 594.74 | 70.93 | 246.68 | 1298.15 | 105.92 | 990.55 | 2.56 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 22659.9 | 23.204 | 336.43 | 405.34 | 470.14 | 523.81 | 636.37 | 95.12 | 347.12 | 1173.42 | 101.67 | 898.77 | 1.89 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 5800.3 | 380.131 | 168.27 | 172.10 | 194.86 | 202.77 | 209.28 | 125.42 | 172.31 | 322.49 | 13.18 | 240.60 | 1.24 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5257.2 | 344.534 | 189.58 | 193.57 | 201.39 | 208.24 | 221.72 | 156.77 | 190.11 | 257.86 | 9.67 | 237.04 | 1.17 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5805.6 | 380.476 | 171.83 | 177.69 | 180.81 | 185.54 | 199.70 | 140.34 | 172.12 | 228.84 | 8.99 | 220.27 | 1.16 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5092.0 | 333.708 | 195.07 | 203.29 | 210.38 | 217.03 | 237.01 | 142.36 | 196.26 | 310.53 | 12.80 | 278.01 | 1.21 | 4000 |
| courierust_h2c_large_body_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 64 | 678.4 | 44.460 | 1478.61 | 1522.43 | 1561.35 | 1572.54 | 1595.38 | 1365.81 | 1473.95 | 1681.62 | 66.05 | 1681.62 | 1.08 | 64 |
| reqwest_async_h2c_large_body_to_hyper | client | h2c | reqwest-async | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 64 | 893.4 | 58.551 | 1015.09 | 1312.68 | 1357.61 | 1376.84 | 1395.23 | 872.70 | 1119.20 | 1411.06 | 182.38 | 1411.06 | 1.37 | 64 |
| courierust_h3_client_to_courierust | client | h3 | courierust-h3 | courierust-h3 | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 4167.0 | 4.267 | 248.62 | 265.67 | 278.81 | 283.39 | 296.83 | 163.59 | 239.90 | 348.75 | 32.24 | 320.48 | 1.19 | 4000 |
| quinn_h3_client_to_courierust | client | h3 | quinn+h3 | courierust-h3 | 1k | 1 | 4 | quinn_single_connection | 1 | 2 | valid | - | 4000 | 3733.1 | 3.823 | 266.08 | 275.97 | 284.16 | 288.59 | 297.83 | 213.49 | 267.78 | 562.75 | 14.15 | 356.04 | 1.12 | 4000 |
| courierust_h3_client_to_courierust | client | h3 | courierust-h3 | courierust-h3 | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 1094.8 | 71.752 | 889.58 | 909.12 | 941.76 | 1203.32 | 1246.40 | 785.39 | 913.28 | 1346.94 | 93.65 | 1287.07 | 1.40 | 4000 |
| quinn_h3_client_to_courierust | client | h3 | quinn+h3 | courierust-h3 | 64k | 1 | 4 | quinn_single_connection | 1 | 2 | valid | - | 4000 | 885.0 | 57.998 | 1192.57 | 1217.46 | 1240.62 | 1255.37 | 1297.43 | 871.86 | 1129.86 | 1572.83 | 128.45 | 1433.75 | 1.09 | 4000 |
## Concurrency and Slow Connections
- These rows measure production usability and resource isolation: an event-driven scheduler must keep idle/partial/slow (Slowloris-style) connections off the worker pool while a fast probe still completes. The `pool` row is the diagnostic counter-model.
| Case | Model | Platform | Status | Event enabled | Connections | Worker threads | Probe us | Probe status | Byte delay us | Completed | Wall ms |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| idle_partial_herd | event | linux | probe_ok | true | 200 | 2 | 1468.80 | - | - | - | - |
| idle_partial_herd | pool | linux | probe_blocked | false | 200 | 2 | na | - | - | - | - |
| slow_sender_herd | event | linux | ok | true | 16 | 2 | 233.78 | probe_ok | 10000 | 16 | 395.90 |
## HTTP/3 (QUIC)
- `h3_connect` is a cold request: QUIC handshake + TLS 1.3 + server Retry address validation on a fresh connection.
- `h3_sequential` and `h3_parallel` reuse the pooled per-authority QUIC connection (`mode=reuse`), so they measure the warm per-request cost of connection reuse.
| Case | Mode | Workers | Requests | Elapsed ms | Connect ms | RPS | P50 us | P75 us | P90 us | P99 us | Min us | Mean us | Max us | Stddev us | P99.9 us | Tail | Samples |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| h3_connect | connect | 1 | 1 | - | 6.532 | - | - | - | - | - | - | - | - | - | - | - | - |
| h3_sequential | reuse | 1 | 1000 | 208.233 | - | 4802.3 | 207.5 | 222.0 | 233.2 | 246.1 | 143.59 | 208.11 | 365.22 | 18.04 | 262.48 | 1.19 | 1000 |
| h3_parallel | reuse | 8 | 1000 | 56.354 | - | 17745.0 | 440.2 | 466.7 | 495.1 | 590.2 | 225.82 | 444.24 | 1228.94 | 56.09 | 1030.83 | 1.34 | 1000 |
## Complexity (time and space)
- Each family is measured at several input sizes (three orders of magnitude), and every point is the minimum of three repeats — noise only ever makes a measurement slower, so the minimum is the right estimator and a noisy point would otherwise invent curvature that is not in the code.
- `class` is named by `median k`, the median of the adjacent-pair exponents, so the label describes the *typical* growth factor per 16× inside the measured range; `max k` is the worst pair, so one noisy pair cannot pass as a trend. `slope b` is the per-unit cost and `fixed a` the per-operation cost that does not scale with the input; R² is the fit quality (1.0 = exact).
- A range whose fixed term dwarfs its per-unit term is labelled `fixed-cost dominated` instead of quoting a sublinear-looking exponent that is really the constant; for those families read `slope b` (for example nanoseconds per extra header).
- Space is attributed per operation by a counting allocator compiled into the bench binary (allocation bytes and allocation calls), and per connection by a live-bytes/RSS delta between 1 and 65 idle keep-alive connections — the fixed process/runtime cost cancels out of a delta.
- `ratio` is Courierust divided by the reference at the same size: below 1 means Courierust is cheaper. Rows are comparable only within one run.
| family | implementation | operation | metric | fitted class | median k | max k | slope b | fixed a | R² | points |
|---|---|---|---|---|---:|---:|---:|---:|---:|---:|
| codec | courierust | encode_unmasked | time_ns | O(n) | 0.999 | 2.011 | 0.039264 | 16816.3233 | 0.2148 | 5 |
| codec | courierust | encode_unmasked | alloc_bytes | O(1) | 0.000 | 0.000 | 0.000000 | 0.0000 | 1.0000 | 5 |
| codec | tungstenite | encode_unmasked | time_ns | O(n) | 0.940 | 1.981 | 0.028084 | 17584.3561 | 0.1172 | 5 |
| codec | tungstenite | encode_unmasked | alloc_bytes | O(1) | 0.000 | 0.000 | 0.000000 | 0.0000 | 1.0000 | 5 |
| codec | courierust | encode_masked | time_ns | O(n) | 0.917 | 1.688 | 0.068078 | 16372.9621 | 0.4146 | 5 |
| codec | courierust | encode_masked | alloc_bytes | O(1) | 0.000 | 0.000 | 0.000000 | 0.0000 | 1.0000 | 5 |
| codec | tungstenite | encode_masked | time_ns | O(n) | 0.940 | 1.119 | 0.073730 | 271.4404 | 0.9995 | 5 |
| codec | tungstenite | encode_masked | alloc_bytes | O(n) | 1.000 | 1.000 | 1.000000 | 0.0000 | 1.0000 | 5 |
| http | courierust | get_roundtrip | time_ns | O(n^0.28) | 0.277 | 1.524 | 1.267833 | 5317.2081 | 0.9671 | 4 |
| http | courierust | get_roundtrip | alloc_bytes | O(n) | 0.976 | 0.998 | 1.999779 | 2441.9626 | 1.0000 | 4 |
| http | reqwest_hyper | get_roundtrip | time_ns | O(n^0.23) | 0.232 | 0.423 | 0.301905 | 140049.9410 | 0.9811 | 4 |
| http | reqwest_hyper | get_roundtrip | alloc_bytes | O(n) | 0.925 | 0.987 | 2.710828 | 34405.6715 | 0.9993 | 4 |
| headers | courierust | get_with_headers | time_ns | O(n^0.38) | 0.381 | 0.381 | 1408.854286 | 79722.3017 | 0.9986 | 3 |
| headers | courierust | get_with_headers | alloc_bytes | O(n) | 0.863 | 0.863 | 980.503095 | 4637.1933 | 1.0000 | 3 |
| headers | reqwest_hyper | get_with_headers | time_ns | O(1) | 0.053 | 0.053 | 248.211458 | 124400.0625 | 0.9620 | 3 |
| headers | reqwest_hyper | get_with_headers | alloc_bytes | O(n^0.60) | 0.596 | 0.596 | 1168.000000 | 24970.6400 | 1.0000 | 3 |
| deflate | courierust | deflate_reused_compressible | time_ns | O(n) | 0.998 | 0.998 | 0.819802 | 405.8950 | 1.0000 | 3 |
| deflate | courierust | deflate_reused_compressible | alloc_bytes | n/a | n/a | n/a | n/a | n/a | n/a | 1 |
| deflate | courierust | deflate_fresh_compressible | time_ns | O(n) | 1.005 | 1.005 | 0.936443 | 736.0626 | 1.0000 | 3 |
| deflate | courierust | deflate_fresh_compressible | alloc_bytes | O(n) | 0.867 | 0.867 | 4.093389 | 131406.3313 | 1.0000 | 3 |
| deflate | courierust | inflate_compressible | time_ns | O(n^0.65) | 0.647 | 0.647 | 0.132597 | 10780.3426 | 0.9955 | 3 |
| deflate | courierust | inflate_compressible | alloc_bytes | fixed-cost dominated | 0.000 | 0.000 | 0.000000 | 29.0000 | 1.0000 | 3 |
| deflate | courierust | deflate_reused_incompressible | time_ns | O(n^1.24) | 1.240 | 1.240 | 22.491589 | -25344.9317 | 1.0000 | 3 |
| deflate | courierust | deflate_reused_incompressible | alloc_bytes | O(1) | 0.000 | 0.000 | 0.000000 | 0.0000 | 1.0000 | 3 |
| deflate | courierust | deflate_fresh_incompressible | time_ns | O(n^1.19) | 1.194 | 1.194 | 25.296703 | -121876.3989 | 0.9999 | 3 |
| deflate | courierust | deflate_fresh_incompressible | alloc_bytes | O(n) | 0.960 | 0.960 | 16.000000 | 131048.0000 | 1.0000 | 3 |
### Constant factors (paired at the same size)
| family | operation | metric | n | courierust | reference | ratio (ours/reference) |
|---|---|---|---:|---:|---:|---:|
| codec | encode_unmasked | time_ns | 64 | 10.8102 | 16.6007 | 0.651 |
| codec | encode_unmasked | alloc_bytes | 64 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 64 | 29.9458 | 37.4798 | 0.799 |
| codec | encode_masked | alloc_bytes | 64 | 0.0000 | 64.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 1024 | 20.7940 | 26.4445 | 0.786 |
| codec | encode_unmasked | alloc_bytes | 1024 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 1024 | 72.5405 | 79.2925 | 0.915 |
| codec | encode_masked | alloc_bytes | 1024 | 0.0000 | 1024.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 16384 | 5492.0950 | 6425.9350 | 0.855 |
| codec | encode_unmasked | alloc_bytes | 16384 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 16384 | 922.6200 | 943.6100 | 0.978 |
| codec | encode_masked | alloc_bytes | 16384 | 0.0000 | 16384.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 262144 | 87651.4750 | 87046.3250 | 1.007 |
| codec | encode_unmasked | alloc_bytes | 262144 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 262144 | 99562.4250 | 20977.3750 | 4.746 |
| codec | encode_masked | alloc_bytes | 262144 | 0.0000 | 262144.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 1048576 | 43056.0500 | 31707.1250 | 1.358 |
| codec | encode_unmasked | alloc_bytes | 1048576 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 1048576 | 71697.9500 | 77247.3000 | 0.928 |
| codec | encode_masked | alloc_bytes | 1048576 | 0.0000 | 1048576.0000 | 0.000 |
| codec | utf8_validate | time_ns | 4608 | 1798.1935 | 1871.2750 | 0.961 |
| http | get_roundtrip | time_ns | 1024 | 84783.1672 | 130674.9970 | 0.649 |
| http | get_roundtrip | alloc_bytes | 1024 | 4585.5871 | 26714.0796 | 0.172 |
| http | get_roundtrip | time_ns | 16384 | 77198.1524 | 131391.0381 | 0.588 |
| http | get_roundtrip | alloc_bytes | 16384 | 35214.4095 | 51458.8381 | 0.684 |
| http | get_roundtrip | time_ns | 262144 | 166469.9600 | 249948.9200 | 0.666 |
| http | get_roundtrip | alloc_bytes | 262144 | 526533.8800 | 794887.4400 | 0.662 |
| http | get_roundtrip | time_ns | 1048576 | 1376662.1200 | 449152.8400 | 3.065 |
| http | get_roundtrip | alloc_bytes | 1048576 | 2099397.0000 | 2864889.3600 | 0.733 |
| headers | get_with_headers | time_ns | 4 | 86838.4950 | 124025.4450 | 0.700 |
| headers | get_with_headers | time_ns | 16 | 100413.0000 | 130080.7750 | 0.772 |
| headers | get_with_headers | time_ns | 64 | 170259.1700 | 139943.7300 | 1.217 |
| deflate | fresh_vs_reused_compressible | time_ns | 1024 | 3203.4750 | 1324.5700 | 2.419 |
| deflate | fresh_vs_reused_compressible | time_ns | 65536 | 60499.2750 | 54048.0250 | 1.119 |
| deflate | fresh_vs_reused_compressible | time_ns | 1048576 | 982766.3000 | 860035.5000 | 1.143 |
| deflate | fresh_vs_reused_incompressible | time_ns | 1024 | 9903.5600 | 8287.2500 | 1.195 |
| deflate | fresh_vs_reused_incompressible | time_ns | 65536 | 1423144.1000 | 1437367.3750 | 0.990 |
| deflate | fresh_vs_reused_incompressible | time_ns | 1048576 | 26410587.8000 | 23559491.2000 | 1.121 |
### Space: cost of one idle connection
| implementation | connections | live KiB/conn | RSS KiB/conn |
|---|---:|---:|---:|
| courierust_event | 65 | 10.04 | 36.06 |
| courierust_blocking | 65 | 32.70 | 16.12 |
| hyper_tokio | 65 | 18.91 | 10.56 |
### Time: selected scaling points
| family | implementation | operation | n (bytes) | ns/op |
|---|---|---|---:|---:|
| codec | courierust | encode_unmasked | 64 | 10.8102 |
| codec | tungstenite | encode_unmasked | 64 | 16.6007 |
| codec | courierust | encode_masked | 64 | 29.9458 |
| codec | tungstenite | encode_masked | 64 | 37.4798 |
| codec | courierust | encode_unmasked | 1024 | 20.7940 |
| codec | tungstenite | encode_unmasked | 1024 | 26.4445 |
| codec | courierust | encode_masked | 1024 | 72.5405 |
| codec | tungstenite | encode_masked | 1024 | 79.2925 |
| codec | courierust | encode_unmasked | 16384 | 5492.0950 |
| codec | tungstenite | encode_unmasked | 16384 | 6425.9350 |
| codec | courierust | encode_masked | 16384 | 922.6200 |
| codec | tungstenite | encode_masked | 16384 | 943.6100 |
| codec | courierust | encode_unmasked | 262144 | 87651.4750 |
| codec | tungstenite | encode_unmasked | 262144 | 87046.3250 |
| codec | courierust | encode_masked | 262144 | 99562.4250 |
| codec | tungstenite | encode_masked | 262144 | 20977.3750 |
| codec | courierust | encode_unmasked | 1048576 | 43056.0500 |
| codec | tungstenite | encode_unmasked | 1048576 | 31707.1250 |
| codec | courierust | encode_masked | 1048576 | 71697.9500 |
| codec | tungstenite | encode_masked | 1048576 | 77247.3000 |
| http | courierust | get_roundtrip | 1024 | 84783.1672 |
| http | reqwest_hyper | get_roundtrip | 1024 | 130674.9970 |
| http | courierust | get_roundtrip | 16384 | 77198.1524 |
| http | reqwest_hyper | get_roundtrip | 16384 | 131391.0381 |
| http | courierust | get_roundtrip | 262144 | 166469.9600 |
| http | reqwest_hyper | get_roundtrip | 262144 | 249948.9200 |
| http | courierust | get_roundtrip | 1048576 | 1376662.1200 |
| http | reqwest_hyper | get_roundtrip | 1048576 | 449152.8400 |
## Reactor / Connection / Stream Evidence
| Protocol | Case | Payload | Workers | Accepted conns | Active conns | Poll syscalls | Wakeups | Queue peak | H1 conns | H1 read | H1 write | H2 conns | H2 active | H2 streams | H2 stream peak | H2 stream/conn peak | H2 read | H2 write | H3 conns | H3 active | H3 streams | H3 active streams | H3 stream peak | H3 stream/conn peak | H3 queue peak | H3 UDP recv | H3 UDP send |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| h2c | h2_multiplex_w1 | 1k | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 1 | 1 | 4254 | 4003 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w1 | 1k | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 1 | 1 | 4003 | 4253 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w8 | 1k | 8 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 8 | 8 | 940 | 689 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w8 | 1k | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 8 | 8 | 689 | 939 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w32 | 1k | 32 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 32 | 32 | 262 | 133 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w32 | 1k | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 32 | 32 | 363 | 261 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w1 | 64k | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 1 | 1 | 8006 | 4004 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w1 | 64k | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 1 | 1 | 20008 | 8005 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w8 | 64k | 8 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 8 | 8 | 1769 | 890 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w8 | 64k | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 8 | 8 | 16893 | 1772 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w32 | 64k | 32 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 32 | 32 | 611 | 427 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w32 | 64k | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 32 | 32 | 16928 | 679 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
## Cross-Machine
| Role | Status | Scope | Protocol | Workers | Max connections | Requests | Bytes | RPS | Resp MB/s | P50 us | P95 us | P99 us | Min us | Mean us | Max us | Stddev us | P99.9 us | Tail | Samples | Reason |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| client | not_configured | remote | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | COURIERUST_REMOTE_URL_not_set |
## Fuzz
| Target | Status | Runs | Duration s | Corpus | Reason |
| --- | --- | --- | --- | --- | --- |
| h2_frame | ok | smoke | 85 | fuzz/corpus/h2_frame | command_exit_0 |
| hpack_block | ok | smoke | 21 | fuzz/corpus/hpack_block | command_exit_0 |
| h1_request | ok | smoke | 22 | fuzz/corpus/h1_request | command_exit_0 |
| h2_connection | ok | smoke | 24 | fuzz/corpus/h2_connection | command_exit_0 |
| ws_frame | ok | smoke | 21 | fuzz/corpus/ws_frame | command_exit_0 |
| ws_handshake | ok | smoke | 22 | fuzz/corpus/ws_handshake | command_exit_0 |
| ws_session | ok | smoke | 22 | fuzz/corpus/ws_session | command_exit_0 |
## Interop Validation
| Case | Result |
| --- | --- |
| courierust_client_h1_to_hyper_h1 | ok |
| courierust_client_h2c_to_hyper_h2 | ok |
| hyper_client_h1_to_courierust_h1 | ok |
| hyper_client_h2c_to_courierust_h2 | ok |
| reqwest_h1_to_courierust_h1 | ok |
| reqwest_h2c_to_courierust_h2 | ok |
| courierust_h2c_large_body_to_hyper_h2 | ok |
| courierust_h1_slow_reader_to_hyper_h1 | ok |
| tls_rejects_untrusted_certificate | ok |
| tls_rejects_hostname_mismatch | ok |
| tls_alpn_downgrade_to_h1 | ok |
| tls_h2_alpn_rejected | ok |
| h1_connection_close_honored | ok |
| courierust_h2_client_survives_peer_goaway | ok |
| h3_self_roundtrip | ok |
| h3_self_connection_reuse | ok |
| h3_self_large_body_flow_control | ok |
| h3_self_multiplex_concurrent | ok |
| suite | all_cases_passed |
## TLS Interop Matrix
| _No TLS interop evidence captured_ | | | | | |
## Captured Benchmark Output
### Throughput
~~~text
courierust throughput suite (loopback)
META|suite=throughput|requests=4000|server_threads=4|max_samples=2048
RESULT|suite=throughput|case=h1_sequential|protocol=h1|mode=sequential|payload=empty|bytes=0|workers=1|server_threads=4|requests=4000|elapsed_ms=324.413|rps=12330.0|response_mbps=0.000|p50_us=81.55|p75_us=84.68|p90_us=88.36|p95_us=90.37|p99_us=95.14|min_us=51.26|mean_us=81.72|max_us=141.53|stddev_us=6.02|p999_us=108.08|tail_ratio=1.17|cv=0.07|samples=2000
RESULT|suite=throughput|case=h1_sequential|protocol=h1|mode=sequential|payload=1k|bytes=1024|workers=1|server_threads=4|requests=4000|elapsed_ms=342.807|rps=11668.4|response_mbps=11.948|p50_us=86.26|p75_us=87.96|p90_us=89.61|p95_us=90.72|p99_us=104.28|min_us=55.13|mean_us=85.54|max_us=119.39|stddev_us=5.37|p999_us=111.38|tail_ratio=1.21|cv=0.06|samples=2000
RESULT|suite=throughput|case=h1_sequential|protocol=h1|mode=sequential|payload=64k|bytes=65536|workers=1|server_threads=4|requests=4000|elapsed_ms=456.263|rps=8766.9|response_mbps=574.546|p50_us=113.56|p75_us=119.02|p90_us=126.17|p95_us=127.61|p99_us=137.56|min_us=88.89|mean_us=113.69|max_us=176.42|stddev_us=9.23|p999_us=162.72|tail_ratio=1.21|cv=0.08|samples=2000
RESULT|suite=throughput|case=h1_parallel_w1|protocol=h1|mode=parallel|payload=1k|bytes=1024|workers=1|server_threads=4|requests=4000|elapsed_ms=343.706|rps=11637.8|response_mbps=11.917|p50_us=85.79|p75_us=87.76|p90_us=92.08|p95_us=97.17|p99_us=107.58|min_us=28.27|mean_us=85.68|max_us=122.91|stddev_us=7.16|p999_us=117.90|tail_ratio=1.25|cv=0.08|samples=2000
RESULT|suite=throughput|case=h1_parallel_w4|protocol=h1|mode=parallel|payload=1k|bytes=1024|workers=4|server_threads=4|requests=4000|elapsed_ms=128.656|rps=31090.5|response_mbps=31.837|p50_us=107.91|p75_us=142.02|p90_us=177.23|p95_us=203.81|p99_us=268.93|min_us=30.11|mean_us=117.89|max_us=488.25|stddev_us=47.81|p999_us=438.54|tail_ratio=2.49|cv=0.41|samples=2000
RESULT|suite=throughput|case=h1_parallel_w8|protocol=h1|mode=parallel|payload=1k|bytes=1024|workers=8|server_threads=8|requests=4000|elapsed_ms=96.513|rps=41445.2|response_mbps=42.440|p50_us=146.29|p75_us=211.42|p90_us=298.58|p95_us=365.52|p99_us=498.52|min_us=26.35|mean_us=169.65|max_us=881.35|stddev_us=101.37|p999_us=808.71|tail_ratio=3.41|cv=0.60|samples=2000
RESULT|suite=throughput|case=h2_multiplex_w1|protocol=h2c|mode=multiplex|payload=1k|bytes=1024|workers=1|server_threads=4|requests=4000|elapsed_ms=406.326|rps=9844.3|response_mbps=10.081|p50_us=103.03|p75_us=105.41|p90_us=111.79|p95_us=118.37|p99_us=122.39|min_us=70.05|mean_us=102.13|max_us=171.08|stddev_us=8.35|p999_us=134.12|tail_ratio=1.19|cv=0.08|samples=2000
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=1k|workers=1|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=1|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=4254|h2_write_syscalls=4003|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=1k|workers=1|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=4003|h2_write_syscalls=4253|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
RESULT|suite=throughput|case=h2_multiplex_w8|protocol=h2c|mode=multiplex|payload=1k|bytes=1024|workers=8|server_threads=4|requests=4000|elapsed_ms=106.599|rps=37523.7|response_mbps=38.424|p50_us=194.94|p75_us=241.59|p90_us=285.45|p95_us=314.35|p99_us=347.48|min_us=95.27|mean_us=209.27|max_us=380.80|stddev_us=51.32|p999_us=369.24|tail_ratio=1.78|cv=0.25|samples=2000
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=1k|workers=8|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=1|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=940|h2_write_syscalls=689|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=1k|workers=8|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=689|h2_write_syscalls=939|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
RESULT|suite=throughput|case=h2_multiplex_w32|protocol=h2c|mode=multiplex|payload=1k|bytes=1024|workers=32|server_threads=4|requests=4000|elapsed_ms=66.474|rps=60174.1|response_mbps=61.618|p50_us=502.74|p75_us=522.85|p90_us=567.10|p95_us=727.42|p99_us=966.00|min_us=199.93|mean_us=523.75|max_us=1137.44|stddev_us=88.02|p999_us=1100.84|tail_ratio=1.92|cv=0.17|samples=2016
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=1k|workers=32|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=1|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=262|h2_write_syscalls=133|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=1k|workers=32|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=363|h2_write_syscalls=261|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
RESULT|suite=throughput|case=h2_multiplex_w1|protocol=h2c|mode=multiplex|payload=64k|bytes=65536|workers=1|server_threads=4|requests=4000|elapsed_ms=614.403|rps=6510.4|response_mbps=426.665|p50_us=151.31|p75_us=159.50|p90_us=162.94|p95_us=165.47|p99_us=181.53|min_us=121.72|mean_us=153.62|max_us=392.37|stddev_us=10.82|p999_us=234.36|tail_ratio=1.20|cv=0.07|samples=2000
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=64k|workers=1|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=8006|h2_write_syscalls=4004|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=64k|workers=1|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=20008|h2_write_syscalls=8005|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
RESULT|suite=throughput|case=h2_multiplex_w8|protocol=h2c|mode=multiplex|payload=64k|bytes=65536|workers=8|server_threads=4|requests=4000|elapsed_ms=332.999|rps=12012.1|response_mbps=787.222|p50_us=660.26|p75_us=726.15|p90_us=828.85|p95_us=925.43|p99_us=1114.05|min_us=182.01|mean_us=667.07|max_us=1363.61|stddev_us=144.82|p999_us=1271.47|tail_ratio=1.69|cv=0.22|samples=2000
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=64k|workers=8|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=1769|h2_write_syscalls=890|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=64k|workers=8|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=16893|h2_write_syscalls=1772|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
RESULT|suite=throughput|case=h2_multiplex_w32|protocol=h2c|mode=multiplex|payload=64k|bytes=65536|workers=32|server_threads=4|requests=4000|elapsed_ms=207.409|rps=19285.6|response_mbps=1263.899|p50_us=1598.30|p75_us=1742.03|p90_us=1820.32|p95_us=1977.32|p99_us=2904.72|min_us=350.56|mean_us=1657.99|max_us=4610.05|stddev_us=304.34|p999_us=4164.24|tail_ratio=1.82|cv=0.18|samples=2016
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=64k|workers=32|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=611|h2_write_syscalls=427|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=64k|workers=32|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=16928|h2_write_syscalls=679|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
RESULT|suite=throughput|case=https_h2_sequential|protocol=https+h2|mode=sequential|payload=empty|bytes=0|workers=1|server_threads=4|requests=2000|elapsed_ms=211.710|rps=9446.9|response_mbps=0.000|p50_us=104.55|p75_us=117.49|p90_us=118.98|p95_us=120.03|p99_us=128.02|min_us=76.04|mean_us=105.76|max_us=149.84|stddev_us=11.92|p999_us=136.66|tail_ratio=1.22|cv=0.11|samples=2000
TLSVERIFY|protocol=https+h2|cert_verified=true|hostname_verified=true|negotiated_alpn=h2|session_resumption=n/a|cipher_suite=0x1303
RESULT|suite=throughput|case=https_h2_sequential|protocol=https+h2|mode=sequential|payload=1k|bytes=1024|workers=1|server_threads=4|requests=2000|elapsed_ms=215.513|rps=9280.2|response_mbps=9.503|p50_us=106.50|p75_us=110.94|p90_us=118.34|p95_us=122.02|p99_us=132.47|min_us=84.66|mean_us=107.68|max_us=252.86|stddev_us=8.70|p999_us=150.10|tail_ratio=1.24|cv=0.08|samples=2000
TLSVERIFY|protocol=https+h2|cert_verified=true|hostname_verified=true|negotiated_alpn=h2|session_resumption=n/a|cipher_suite=0x1303
RESULT|suite=throughput|case=https_h2_sequential|protocol=https+h2|mode=sequential|payload=64k|bytes=65536|workers=1|server_threads=4|requests=2000|elapsed_ms=1048.593|rps=1907.3|response_mbps=124.998|p50_us=523.26|p75_us=533.77|p90_us=541.27|p95_us=546.95|p99_us=557.03|min_us=491.11|mean_us=524.21|max_us=640.36|stddev_us=13.38|p999_us=607.17|tail_ratio=1.06|cv=0.03|samples=2000
TLSVERIFY|protocol=https+h2|cert_verified=true|hostname_verified=true|negotiated_alpn=h2|session_resumption=n/a|cipher_suite=0x1303
total: complete
~~~
### Cross-Library Comparison
~~~text
courierust comparison suite (loopback, shared-peer matrix)
META|suite=compare|requests_per_repetition=2000|parallel_requests_per_repetition=2000|parallel_workers=8|repetitions=2|max_samples=2048
RESULT|suite=compare|case=raw_tcp_floor|layer=transport|protocol=h1|client=std_tcp|server=std_tcp|payload=4b|bytes=4|workers=1|server_threads=1|pool_policy=raw_tcp|pool_value=1|repetitions=1|status=valid|reason=-|requests=2000|elapsed_ms=85.576|rps=23370.9|response_mbps=0.093|p50_us=44.13|p75_us=44.48|p90_us=44.83|p95_us=45.16|p99_us=50.39|min_us=28.93|mean_us=42.72|max_us=71.42|stddev_us=4.38|p999_us=63.34|tail_ratio=1.14|cv=0.10|samples=2000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h1|client=courierust|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=253.489|rps=15779.7|response_mbps=16.158|p50_us=60.47|p75_us=75.17|p90_us=77.00|p95_us=77.87|p99_us=82.18|min_us=27.36|mean_us=63.28|max_us=122.66|stddev_us=9.91|p999_us=91.20|tail_ratio=1.36|cv=0.16|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h1|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=513.846|rps=7784.4|response_mbps=7.971|p50_us=118.44|p75_us=144.89|p90_us=147.28|p95_us=150.67|p99_us=248.82|min_us=86.33|mean_us=128.37|max_us=584.32|stddev_us=27.18|p999_us=334.14|tail_ratio=2.10|cv=0.21|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h1|client=reqwest|server=courierust|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=633.556|rps=6313.6|response_mbps=6.465|p50_us=159.67|p75_us=164.04|p90_us=167.65|p95_us=171.29|p99_us=179.25|min_us=120.42|mean_us=158.31|max_us=226.94|stddev_us=9.23|p999_us=208.25|tail_ratio=1.12|cv=0.06|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h1|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=453.245|rps=8825.3|response_mbps=9.037|p50_us=112.79|p75_us=114.59|p90_us=125.90|p95_us=129.24|p99_us=146.21|min_us=84.92|mean_us=113.27|max_us=351.23|stddev_us=9.84|p999_us=169.39|tail_ratio=1.30|cv=0.09|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h1|client=courierust|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=64.626|rps=61894.7|response_mbps=63.380|p50_us=111.54|p75_us=152.15|p90_us=187.44|p95_us=212.96|p99_us=312.04|min_us=37.16|mean_us=122.10|max_us=2759.32|stddev_us=94.51|p999_us=899.77|tail_ratio=2.80|cv=0.77|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h1|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=165.267|rps=24203.3|response_mbps=24.784|p50_us=328.05|p75_us=350.31|p90_us=373.48|p95_us=395.96|p99_us=522.39|min_us=101.03|mean_us=326.09|max_us=1733.34|stddev_us=64.96|p999_us=847.00|tail_ratio=1.59|cv=0.20|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h1|client=courierust|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=357.244|rps=11196.8|response_mbps=733.795|p50_us=83.18|p75_us=100.98|p90_us=102.30|p95_us=103.33|p99_us=115.17|min_us=62.26|mean_us=89.24|max_us=150.76|stddev_us=11.74|p999_us=127.28|tail_ratio=1.38|cv=0.13|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h1|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=602.730|rps=6636.5|response_mbps=434.928|p50_us=153.69|p75_us=165.45|p90_us=167.39|p95_us=169.14|p99_us=184.77|min_us=111.05|mean_us=150.62|max_us=235.86|stddev_us=17.19|p999_us=196.07|tail_ratio=1.20|cv=0.11|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h1|client=reqwest|server=courierust|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=718.013|rps=5570.9|response_mbps=365.096|p50_us=180.13|p75_us=186.80|p90_us=189.70|p95_us=193.92|p99_us=205.21|min_us=137.98|mean_us=179.44|max_us=304.56|stddev_us=10.83|p999_us=230.85|tail_ratio=1.14|cv=0.06|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h1|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=598.642|rps=6681.8|response_mbps=437.898|p50_us=151.29|p75_us=165.41|p90_us=167.99|p95_us=169.57|p99_us=180.24|min_us=105.71|mean_us=149.61|max_us=289.46|stddev_us=16.46|p999_us=221.17|tail_ratio=1.19|cv=0.11|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=477.148|rps=8383.1|response_mbps=8.584|p50_us=118.03|p75_us=125.59|p90_us=127.44|p95_us=131.88|p99_us=143.63|min_us=94.08|mean_us=119.23|max_us=157.94|stddev_us=8.86|p999_us=149.08|tail_ratio=1.22|cv=0.07|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h2c|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=597.228|rps=6697.6|response_mbps=6.858|p50_us=148.92|p75_us=151.44|p90_us=155.32|p95_us=157.57|p99_us=166.35|min_us=122.12|mean_us=149.21|max_us=208.33|stddev_us=5.92|p999_us=193.95|tail_ratio=1.12|cv=0.04|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h2c|client=reqwest|server=courierust|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=538.902|rps=7422.5|response_mbps=7.601|p50_us=134.07|p75_us=136.52|p90_us=140.26|p95_us=142.42|p99_us=152.86|min_us=107.38|mean_us=134.62|max_us=527.95|stddev_us=9.47|p999_us=195.58|tail_ratio=1.14|cv=0.07|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h2c|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=604.914|rps=6612.5|response_mbps=6.771|p50_us=150.20|p75_us=153.45|p90_us=157.27|p95_us=159.47|p99_us=172.48|min_us=117.60|mean_us=151.12|max_us=620.23|stddev_us=15.00|p999_us=373.87|tail_ratio=1.15|cv=0.10|samples=4000
RESULT|suite=compare|case=courierust_h2_conn1xw32|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=32|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=101.462|rps=39423.7|response_mbps=40.370|p50_us=761.37|p75_us=891.37|p90_us=1041.77|p95_us=1136.10|p99_us=1402.39|min_us=126.42|mean_us=776.36|max_us=2110.83|stddev_us=213.74|p999_us=1779.15|tail_ratio=1.84|cv=0.28|samples=4000
RESULT|suite=compare|case=courierust_h2_conn4xw8|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=32|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=4|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=85.503|rps=46782.1|response_mbps=47.905|p50_us=586.00|p75_us=792.72|p90_us=997.63|p95_us=1146.34|p99_us=1524.79|min_us=76.34|mean_us=626.31|max_us=2492.04|stddev_us=293.32|p999_us=2106.55|tail_ratio=2.60|cv=0.47|samples=4000
RESULT|suite=compare|case=courierust_h2_conn8xw4|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=32|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=92.742|rps=43130.5|response_mbps=44.166|p50_us=627.51|p75_us=847.07|p90_us=1063.39|p95_us=1234.34|p99_us=1713.79|min_us=71.35|mean_us=671.98|max_us=3414.48|stddev_us=329.18|p999_us=2798.49|tail_ratio=2.73|cv=0.49|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=126.306|rps=31669.2|response_mbps=32.429|p50_us=232.61|p75_us=292.82|p90_us=363.33|p95_us=422.99|p99_us=594.74|min_us=70.93|mean_us=246.68|max_us=1298.15|stddev_us=105.92|p999_us=990.55|tail_ratio=2.56|cv=0.43|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h2c|client=reqwest|server=hyper|payload=1k|bytes=1024|workers=8|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=8|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=176.523|rps=22659.9|response_mbps=23.204|p50_us=336.43|p75_us=405.34|p90_us=470.14|p95_us=523.81|p99_us=636.37|min_us=95.12|mean_us=347.12|max_us=1173.42|stddev_us=101.67|p999_us=898.77|tail_ratio=1.89|cv=0.29|samples=4000
RESULT|suite=compare|case=courierust_client_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=689.615|rps=5800.3|response_mbps=380.131|p50_us=168.27|p75_us=172.10|p90_us=194.86|p95_us=202.77|p99_us=209.28|min_us=125.42|mean_us=172.31|max_us=322.49|stddev_us=13.18|p999_us=240.60|tail_ratio=1.24|cv=0.08|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=client|protocol=h2c|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=760.865|rps=5257.2|response_mbps=344.534|p50_us=189.58|p75_us=193.57|p90_us=201.39|p95_us=208.24|p99_us=221.72|min_us=156.77|mean_us=190.11|max_us=257.86|stddev_us=9.67|p999_us=237.04|tail_ratio=1.17|cv=0.05|samples=4000
RESULT|suite=compare|case=reqwest_client_to_courierust|layer=server|protocol=h2c|client=reqwest|server=courierust|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=688.990|rps=5805.6|response_mbps=380.476|p50_us=171.83|p75_us=177.69|p90_us=180.81|p95_us=185.54|p99_us=199.70|min_us=140.34|mean_us=172.12|max_us=228.84|stddev_us=8.99|p999_us=220.27|tail_ratio=1.16|cv=0.05|samples=4000
RESULT|suite=compare|case=reqwest_client_to_hyper|layer=server|protocol=h2c|client=reqwest|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=785.549|rps=5092.0|response_mbps=333.708|p50_us=195.07|p75_us=203.29|p90_us=210.38|p95_us=217.03|p99_us=237.01|min_us=142.36|mean_us=196.26|max_us=310.53|stddev_us=12.80|p999_us=278.01|tail_ratio=1.21|cv=0.07|samples=4000
RESULT|suite=compare|case=courierust_h2c_large_body_to_hyper|layer=client|protocol=h2c|client=courierust|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=64|elapsed_ms=94.340|rps=678.4|response_mbps=44.460|p50_us=1478.61|p75_us=1522.43|p90_us=1561.35|p95_us=1572.54|p99_us=1595.38|min_us=1365.81|mean_us=1473.95|max_us=1681.62|stddev_us=66.05|p999_us=1681.62|tail_ratio=1.08|cv=0.04|samples=64
RESULT|suite=compare|case=reqwest_async_h2c_large_body_to_hyper|layer=client|protocol=h2c|client=reqwest-async|server=hyper|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=reqwest_pool_max_idle_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=64|elapsed_ms=71.635|rps=893.4|response_mbps=58.551|p50_us=1015.09|p75_us=1312.68|p90_us=1357.61|p95_us=1376.84|p99_us=1395.23|min_us=872.70|mean_us=1119.20|max_us=1411.06|stddev_us=182.38|p999_us=1411.06|tail_ratio=1.37|cv=0.16|samples=64
RESULT|suite=compare|case=courierust_h3_client_to_courierust|layer=client|protocol=h3|client=courierust-h3|server=courierust-h3|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=959.918|rps=4167.0|response_mbps=4.267|p50_us=248.62|p75_us=265.67|p90_us=278.81|p95_us=283.39|p99_us=296.83|min_us=163.59|mean_us=239.90|max_us=348.75|stddev_us=32.24|p999_us=320.48|tail_ratio=1.19|cv=0.13|samples=4000
RESULT|suite=compare|case=quinn_h3_client_to_courierust|layer=client|protocol=h3|client=quinn+h3|server=courierust-h3|payload=1k|bytes=1024|workers=1|server_threads=4|pool_policy=quinn_single_connection|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=1071.492|rps=3733.1|response_mbps=3.823|p50_us=266.08|p75_us=275.97|p90_us=284.16|p95_us=288.59|p99_us=297.83|min_us=213.49|mean_us=267.78|max_us=562.75|stddev_us=14.15|p999_us=356.04|tail_ratio=1.12|cv=0.05|samples=4000
RESULT|suite=compare|case=courierust_h3_client_to_courierust|layer=client|protocol=h3|client=courierust-h3|server=courierust-h3|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=courierust_max_connections_per_host|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=3653.469|rps=1094.8|response_mbps=71.752|p50_us=889.58|p75_us=909.12|p90_us=941.76|p95_us=1203.32|p99_us=1246.40|min_us=785.39|mean_us=913.28|max_us=1346.94|stddev_us=93.65|p999_us=1287.07|tail_ratio=1.40|cv=0.10|samples=4000
RESULT|suite=compare|case=quinn_h3_client_to_courierust|layer=client|protocol=h3|client=quinn+h3|server=courierust-h3|payload=64k|bytes=65536|workers=1|server_threads=4|pool_policy=quinn_single_connection|pool_value=1|repetitions=2|status=valid|reason=-|requests=4000|elapsed_ms=4519.887|rps=885.0|response_mbps=57.998|p50_us=1192.57|p75_us=1217.46|p90_us=1240.62|p95_us=1255.37|p99_us=1297.43|min_us=871.86|mean_us=1129.86|max_us=1572.83|stddev_us=128.45|p999_us=1433.75|tail_ratio=1.09|cv=0.11|samples=4000
total: complete
~~~
### Concurrency
~~~text
CONCURRENCY|case=idle_partial_herd|model=event|platform=linux|status=probe_ok|event_enabled=true|connections=200|worker_threads=2|probe_us=1468.80
CONCURRENCY|case=idle_partial_herd|model=pool|platform=linux|status=probe_blocked|event_enabled=false|connections=200|worker_threads=2|probe_us=na|error=read: Resource temporarily unavailable (os error 11)
CONCURRENCY|case=slow_sender_herd|model=event|platform=linux|status=ok|event_enabled=true|connections=16|worker_threads=2|completed=16|probe_status=probe_ok|probe_us=233.78|byte_delay_us=10000|wall_ms=395.90
CONCURRENCY|suite=complete
~~~
### HTTP/3 (QUIC)
~~~text
RESULT|suite=h3|case=h3_connect|protocol=h3|mode=connect|payload=empty|bytes=0|workers=1|requests=1|connect_ms=6.532
RESULT|suite=h3|case=h3_sequential|protocol=h3|mode=reuse|payload=empty|bytes=0|workers=1|requests=1000|elapsed_ms=208.233|rps=4802.3|p50_us=207.5|p75_us=222.0|p90_us=233.2|p99_us=246.1|min_us=143.59|mean_us=208.11|max_us=365.22|stddev_us=18.04|p999_us=262.48|tail_ratio=1.19|cv=0.09|samples=1000
RESULT|suite=h3|case=h3_parallel|protocol=h3|mode=reuse|payload=empty|bytes=0|workers=8|requests=1000|elapsed_ms=56.354|rps=17745.0|p50_us=440.2|p75_us=466.7|p90_us=495.1|p99_us=590.2|min_us=225.82|mean_us=444.24|max_us=1228.94|stddev_us=56.09|p999_us=1030.83|tail_ratio=1.34|cv=0.13|samples=1000
~~~
### Reactor / Connection / Stream Evidence
~~~text
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=1k|workers=1|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=1|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=4254|h2_write_syscalls=4003|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=1k|workers=1|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=4003|h2_write_syscalls=4253|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=1k|workers=8|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=1|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=940|h2_write_syscalls=689|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=1k|workers=8|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=689|h2_write_syscalls=939|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=1k|workers=32|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=1|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=262|h2_write_syscalls=133|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=1k|workers=32|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=363|h2_write_syscalls=261|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=64k|workers=1|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=8006|h2_write_syscalls=4004|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w1|payload=64k|workers=1|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=1|h2_streams_per_connection_peak=1|h2_read_syscalls=20008|h2_write_syscalls=8005|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=64k|workers=8|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=1769|h2_write_syscalls=890|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w8|payload=64k|workers=8|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=8|h2_streams_per_connection_peak=8|h2_read_syscalls=16893|h2_write_syscalls=1772|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=64k|workers=32|connections_accepted=1|connections_active=0|event_poll_syscalls=1|event_wakeups=1|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=611|h2_write_syscalls=427|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
STATS|suite=throughput|protocol=h2c|case=h2_multiplex_w32|payload=64k|workers=32|connections_accepted=0|connections_active=0|event_poll_syscalls=0|event_wakeups=0|event_wait_errors=0|event_queue_depth_peak=0|h1_connections=0|h1_read_syscalls=0|h1_write_syscalls=0|h2_connections=1|h2_connections_active=1|h2_streams_total=4001|h2_streams_timed_out=0|h2_streams_active=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=16928|h2_write_syscalls=679|h3_connections=0|h3_connections_active=0|h3_streams_total=0|h3_streams_active=0|h3_streams_active_peak=0|h3_streams_per_connection_peak=0|h3_queue_depth_peak=0|h3_udp_recv_syscalls=0|h3_udp_send_syscalls=0|h3_ack_deferred=0|h3_credit_stalls=0
~~~
### Cross-Machine
~~~text
NETWORK|role=client|status=not_configured|target_scope=remote|reason=COURIERUST_REMOTE_URL_not_set
~~~
### Fuzz
~~~text
FUZZ|target=h2_frame|status=ok|runs=smoke|duration_s=85|corpus=fuzz/corpus/h2_frame|reason=command_exit_0
FUZZ|target=hpack_block|status=ok|runs=smoke|duration_s=21|corpus=fuzz/corpus/hpack_block|reason=command_exit_0
FUZZ|target=h1_request|status=ok|runs=smoke|duration_s=22|corpus=fuzz/corpus/h1_request|reason=command_exit_0
FUZZ|target=h2_connection|status=ok|runs=smoke|duration_s=24|corpus=fuzz/corpus/h2_connection|reason=command_exit_0
FUZZ|target=ws_frame|status=ok|runs=smoke|duration_s=21|corpus=fuzz/corpus/ws_frame|reason=command_exit_0
FUZZ|target=ws_handshake|status=ok|runs=smoke|duration_s=22|corpus=fuzz/corpus/ws_handshake|reason=command_exit_0
FUZZ|target=ws_session|status=ok|runs=smoke|duration_s=22|corpus=fuzz/corpus/ws_session|reason=command_exit_0
~~~
### Interop Validation
~~~text
courierust vs mainstream HTTP stack — interop validation
INTEROP|case=courierust_client_h1_to_hyper_h1|ok
INTEROP|case=courierust_client_h2c_to_hyper_h2|ok
INTEROP|case=hyper_client_h1_to_courierust_h1|ok
INTEROP|case=hyper_client_h2c_to_courierust_h2|ok
INTEROP|case=reqwest_h1_to_courierust_h1|ok
INTEROP|case=reqwest_h2c_to_courierust_h2|ok
INTEROP|case=courierust_h2c_large_body_to_hyper_h2|ok
INTEROP|case=courierust_h1_slow_reader_to_hyper_h1|ok
INTEROP|case=tls_rejects_untrusted_certificate|ok
INTEROP|case=tls_rejects_hostname_mismatch|ok
INTEROP|case=tls_alpn_downgrade_to_h1|ok
INTEROP|case=tls_h2_alpn_rejected|ok
INTEROP|case=h1_connection_close_honored|ok
INTEROP|case=courierust_h2_client_survives_peer_goaway|ok
INTEROP|case=h3_self_roundtrip|ok
INTEROP|case=h3_self_connection_reuse|ok
INTEROP|case=h3_self_large_body_flow_control|ok
INTEROP|case=h3_self_multiplex_concurrent|ok
INTEROP|all_cases_passed
~~~
### TLS Interop
~~~text
No output was captured for this benchmark.
~~~