# GitHub Action Benchmark
Generated by the benchmark workflow.
## Run
- Commit: ee404a3cbde19c3ffcd5c6a1764678447feb8b0f
- 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: [34808876164](https://github.com/blueokanna/Courierust/actions/runs/34808876164)
## 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 | 12897.9 | 0.000 | 78.35 | 79.98 | 81.87 | 83.21 | 88.97 | 49.45 | 77.35 | 104.44 | 5.25 | 99.01 | 1.14 | 2000 |
| h1_sequential | h1 | sequential | 1k | 1 | 4 | 4000 | 12950.6 | 13.261 | 79.52 | 82.38 | 84.12 | 85.56 | 91.52 | 25.11 | 75.30 | 119.26 | 9.72 | 104.94 | 1.15 | 2000 |
| h1_sequential | h1 | sequential | 64k | 1 | 4 | 4000 | 9204.3 | 603.212 | 108.34 | 114.08 | 122.15 | 125.09 | 134.44 | 84.38 | 108.87 | 155.22 | 9.94 | 151.72 | 1.24 | 2000 |
| h1_parallel_w1 | h1 | parallel | 1k | 1 | 4 | 4000 | 12331.4 | 12.627 | 81.28 | 84.69 | 87.98 | 92.64 | 101.98 | 54.07 | 81.33 | 128.80 | 7.14 | 113.75 | 1.25 | 2000 |
| h1_parallel_w4 | h1 | parallel | 1k | 4 | 4 | 4000 | 31734.5 | 32.496 | 105.62 | 137.92 | 176.08 | 203.86 | 263.32 | 25.33 | 114.79 | 544.06 | 49.12 | 447.88 | 2.49 | 2000 |
| h1_parallel_w8 | h1 | parallel | 1k | 8 | 8 | 4000 | 42509.7 | 43.530 | 150.68 | 208.65 | 290.49 | 359.55 | 577.35 | 25.50 | 173.94 | 2872.59 | 126.34 | 1304.29 | 3.83 | 2000 |
| h2_multiplex_w1 | h2c | multiplex | 1k | 1 | 4 | 4000 | 10137.3 | 10.381 | 99.57 | 101.35 | 111.02 | 115.54 | 120.00 | 69.76 | 99.25 | 182.77 | 8.29 | 134.06 | 1.21 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 1k | 8 | 4 | 4000 | 39709.4 | 40.662 | 183.47 | 232.88 | 280.66 | 300.40 | 333.39 | 95.19 | 198.86 | 428.59 | 52.55 | 373.28 | 1.82 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 1k | 32 | 4 | 4000 | 60112.5 | 61.555 | 483.47 | 514.34 | 753.47 | 860.84 | 927.38 | 138.42 | 519.24 | 1821.57 | 150.54 | 1600.88 | 1.92 | 2016 |
| h2_multiplex_w1 | h2c | multiplex | 64k | 1 | 4 | 4000 | 6552.4 | 429.417 | 146.94 | 159.85 | 173.02 | 176.35 | 186.60 | 119.07 | 152.75 | 427.45 | 14.06 | 240.31 | 1.27 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 64k | 8 | 4 | 4000 | 16876.1 | 1105.990 | 466.66 | 505.94 | 543.49 | 581.70 | 780.39 | 144.30 | 471.65 | 2697.33 | 95.04 | 1003.38 | 1.67 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 64k | 32 | 4 | 4000 | 15253.4 | 999.644 | 1964.96 | 2389.20 | 2679.33 | 2982.43 | 3496.31 | 162.01 | 2072.58 | 3681.60 | 493.26 | 3616.90 | 1.78 | 2016 |
| https_h2_sequential | https+h2 | sequential | empty | 1 | 4 | 2000 | 10131.6 | 0.000 | 97.57 | 111.86 | 113.11 | 113.92 | 117.14 | 60.44 | 98.63 | 203.54 | 13.26 | 131.86 | 1.20 | 2000 |
| https_h2_sequential | https+h2 | sequential | 1k | 1 | 4 | 2000 | 9115.8 | 9.335 | 110.63 | 112.66 | 116.51 | 122.98 | 130.20 | 82.48 | 109.64 | 151.46 | 7.70 | 143.65 | 1.18 | 2000 |
| https_h2_sequential | https+h2 | sequential | 64k | 1 | 4 | 2000 | 2257.9 | 147.975 | 427.76 | 449.99 | 472.34 | 534.47 | 549.76 | 398.46 | 442.82 | 615.83 | 32.66 | 565.82 | 1.29 | 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 | 26183.0 | 0.105 | 40.71 | 42.94 | 43.48 | 43.88 | 49.57 | 27.84 | 38.10 | 75.70 | 6.10 | 59.10 | 1.22 | 2000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 13107.2 | 13.422 | 67.37 | 72.51 | 74.67 | 176.41 | 317.31 | 41.96 | 76.22 | 547.92 | 49.80 | 451.20 | 4.71 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7162.8 | 7.335 | 140.36 | 142.09 | 146.14 | 191.19 | 254.77 | 94.70 | 139.48 | 676.02 | 30.36 | 375.18 | 1.82 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6643.5 | 6.803 | 151.17 | 155.67 | 159.06 | 161.64 | 171.17 | 123.82 | 150.44 | 207.97 | 7.94 | 189.92 | 1.13 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 8730.8 | 8.940 | 109.59 | 113.50 | 140.23 | 141.43 | 144.21 | 93.77 | 114.46 | 167.85 | 12.14 | 154.31 | 1.32 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 70767.9 | 72.466 | 95.83 | 134.15 | 175.62 | 202.58 | 311.52 | 31.82 | 109.14 | 1411.85 | 67.50 | 746.76 | 3.25 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 24459.0 | 25.046 | 326.25 | 345.56 | 365.50 | 381.57 | 494.78 | 102.47 | 324.39 | 877.22 | 52.70 | 797.83 | 1.52 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 10455.2 | 685.193 | 97.03 | 116.81 | 118.74 | 119.55 | 125.73 | 60.47 | 95.58 | 198.88 | 17.69 | 162.68 | 1.30 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6889.3 | 451.496 | 147.21 | 161.69 | 163.42 | 164.35 | 172.83 | 106.41 | 145.08 | 219.17 | 16.06 | 188.47 | 1.17 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5742.9 | 376.368 | 173.50 | 180.53 | 185.35 | 188.54 | 197.85 | 134.46 | 174.04 | 411.13 | 10.41 | 221.78 | 1.14 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7242.9 | 474.672 | 130.90 | 147.45 | 163.49 | 164.49 | 167.72 | 106.25 | 137.98 | 218.80 | 15.90 | 194.12 | 1.28 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 9180.1 | 9.400 | 108.06 | 110.15 | 118.27 | 122.13 | 127.85 | 80.53 | 108.88 | 172.11 | 7.01 | 149.78 | 1.18 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6732.6 | 6.894 | 148.69 | 151.28 | 153.97 | 155.53 | 163.42 | 118.87 | 148.43 | 198.22 | 5.39 | 179.31 | 1.10 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7517.1 | 7.698 | 133.32 | 135.68 | 137.95 | 139.63 | 148.86 | 103.85 | 132.92 | 175.91 | 5.48 | 165.38 | 1.12 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 6507.1 | 6.663 | 153.31 | 156.17 | 159.11 | 162.99 | 179.96 | 118.24 | 153.58 | 1378.88 | 25.28 | 274.03 | 1.17 | 4000 |
| courierust_h2_conn1xw32 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 42562.9 | 43.584 | 704.61 | 823.68 | 961.38 | 1077.21 | 1338.61 | 77.16 | 711.19 | 2274.39 | 215.25 | 1696.09 | 1.90 | 4000 |
| courierust_h2_conn4xw8 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 4 | 2 | valid | - | 4000 | 48842.4 | 50.015 | 574.32 | 758.92 | 937.44 | 1080.74 | 1403.79 | 87.25 | 607.89 | 2561.40 | 264.64 | 1741.00 | 2.44 | 4000 |
| courierust_h2_conn8xw4 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 45348.2 | 46.437 | 613.57 | 835.16 | 1039.97 | 1160.94 | 1527.41 | 93.40 | 649.87 | 2095.35 | 298.42 | 1983.89 | 2.49 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 33551.5 | 34.357 | 219.37 | 276.71 | 347.84 | 398.78 | 542.76 | 74.51 | 234.01 | 954.86 | 93.02 | 864.94 | 2.47 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 23109.3 | 23.664 | 331.08 | 397.60 | 469.57 | 513.74 | 620.91 | 110.39 | 342.12 | 920.59 | 96.50 | 767.38 | 1.88 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 5100.1 | 334.241 | 198.17 | 211.57 | 232.18 | 234.72 | 251.16 | 115.34 | 196.02 | 498.44 | 27.91 | 264.93 | 1.27 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5527.3 | 362.238 | 180.51 | 183.99 | 190.52 | 197.80 | 215.00 | 150.09 | 180.82 | 245.55 | 9.45 | 230.05 | 1.19 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5515.6 | 361.468 | 181.66 | 194.21 | 198.36 | 200.03 | 210.94 | 146.19 | 181.20 | 283.82 | 13.85 | 226.38 | 1.16 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 5465.9 | 358.214 | 182.21 | 185.75 | 191.75 | 198.73 | 216.27 | 154.78 | 182.86 | 340.94 | 9.41 | 241.65 | 1.19 | 4000 |
| courierust_h2c_large_body_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 64 | 552.9 | 36.233 | 1904.01 | 1968.71 | 2009.30 | 2016.31 | 2031.32 | 1586.32 | 1808.66 | 2065.74 | 171.38 | 2065.74 | 1.07 | 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 | 965.9 | 63.298 | 976.81 | 1016.45 | 1325.32 | 1372.34 | 1537.35 | 842.24 | 1035.25 | 1537.65 | 161.84 | 1537.65 | 1.57 | 64 |
| courierust_h3_client_to_courierust | client | h3 | courierust-h3 | courierust-h3 | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 4712.1 | 4.825 | 212.29 | 222.53 | 235.18 | 243.59 | 271.58 | 147.18 | 212.13 | 333.02 | 20.23 | 292.19 | 1.28 | 4000 |
| quinn_h3_client_to_courierust | client | h3 | quinn+h3 | courierust-h3 | 1k | 1 | 4 | quinn_single_connection | 1 | 2 | valid | - | 4000 | 3857.7 | 3.950 | 260.39 | 269.63 | 275.22 | 278.36 | 290.00 | 202.83 | 259.13 | 350.74 | 14.14 | 322.61 | 1.11 | 4000 |
| courierust_h3_client_to_courierust | client | h3 | courierust-h3 | courierust-h3 | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 1137.3 | 74.531 | 863.23 | 884.73 | 907.32 | 1084.37 | 1221.02 | 780.27 | 879.21 | 1348.01 | 78.27 | 1282.07 | 1.41 | 4000 |
| quinn_h3_client_to_courierust | client | h3 | quinn+h3 | courierust-h3 | 64k | 1 | 4 | quinn_single_connection | 1 | 2 | valid | - | 4000 | 884.2 | 57.944 | 1191.61 | 1211.82 | 1231.10 | 1242.05 | 1270.08 | 849.88 | 1130.89 | 1373.74 | 126.30 | 1327.16 | 1.07 | 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 | 245.13 | - | - | - | - |
| idle_partial_herd | pool | linux | probe_blocked | false | 200 | 2 | na | - | - | - | - |
| slow_sender_herd | event | linux | ok | true | 16 | 2 | 158.59 | probe_ok | 10000 | 16 | 395.55 |
## 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.626 | - | - | - | - | - | - | - | - | - | - | - | - |
| h3_sequential | reuse | 1 | 1000 | 189.952 | - | 5264.5 | 185.6 | 190.8 | 214.9 | 227.2 | 153.27 | 189.82 | 263.28 | 13.13 | 242.38 | 1.22 | 1000 |
| h3_parallel | reuse | 8 | 1000 | 54.105 | - | 18482.5 | 424.1 | 448.5 | 471.3 | 537.6 | 257.08 | 427.60 | 834.26 | 42.99 | 798.83 | 1.27 | 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) | 1.002 | 2.009 | 0.034041 | 16975.8598 | 0.1677 | 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) | 1.005 | 1.929 | 0.025605 | 17632.7268 | 0.0955 | 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.920 | 1.685 | 0.066856 | 16254.9222 | 0.4095 | 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.980 | 1.087 | 0.071815 | 56.3603 | 0.9999 | 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.24) | 0.243 | 1.573 | 1.259381 | 1656.2517 | 0.9644 | 4 |
| http | courierust | get_roundtrip | alloc_bytes | O(n) | 0.979 | 0.998 | 1.999770 | 2066.0425 | 1.0000 | 4 |
| http | reqwest_hyper | get_roundtrip | time_ns | O(n^0.28) | 0.285 | 0.531 | 0.319085 | 111381.6206 | 0.9897 | 4 |
| http | reqwest_hyper | get_roundtrip | alloc_bytes | O(n) | 0.876 | 0.990 | 2.543443 | 48933.7487 | 0.9979 | 4 |
| headers | courierust | get_with_headers | time_ns | O(n^0.37) | 0.366 | 0.366 | 1128.328690 | 75501.3050 | 0.9889 | 3 |
| headers | courierust | get_with_headers | alloc_bytes | O(n) | 0.857 | 0.857 | 883.539048 | 4476.3733 | 1.0000 | 3 |
| headers | reqwest_hyper | get_with_headers | time_ns | O(n^0.21) | 0.208 | 0.208 | 786.159018 | 109563.3575 | 0.9946 | 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.996 | 0.996 | 0.821704 | 479.6895 | 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) | 0.992 | 0.992 | 0.899303 | 1842.6671 | 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.67) | 0.672 | 0.672 | 0.138134 | 10052.1734 | 0.9966 | 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.26) | 1.259 | 1.259 | 23.579761 | -47047.0981 | 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.21) | 1.206 | 1.206 | 25.985213 | -129170.6744 | 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 | 9.8758 | 13.9360 | 0.709 |
| codec | encode_unmasked | alloc_bytes | 64 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 64 | 29.9510 | 37.8357 | 0.792 |
| codec | encode_masked | alloc_bytes | 64 | 0.0000 | 64.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 1024 | 20.6185 | 25.7730 | 0.800 |
| codec | encode_unmasked | alloc_bytes | 1024 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 1024 | 72.0195 | 76.8790 | 0.937 |
| codec | encode_masked | alloc_bytes | 1024 | 0.0000 | 1024.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 16384 | 5418.1750 | 5423.5900 | 0.999 |
| codec | encode_unmasked | alloc_bytes | 16384 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 16384 | 922.9250 | 950.9750 | 0.971 |
| codec | encode_masked | alloc_bytes | 16384 | 0.0000 | 16384.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 262144 | 87055.2500 | 87900.3250 | 0.990 |
| codec | encode_unmasked | alloc_bytes | 262144 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 262144 | 98626.6250 | 19353.9500 | 5.096 |
| codec | encode_masked | alloc_bytes | 262144 | 0.0000 | 262144.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 1048576 | 37588.7750 | 28807.8500 | 1.305 |
| codec | encode_unmasked | alloc_bytes | 1048576 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 1048576 | 70420.1500 | 75246.9250 | 0.936 |
| codec | encode_masked | alloc_bytes | 1048576 | 0.0000 | 1048576.0000 | 0.000 |
| codec | utf8_validate | time_ns | 4608 | 1461.9335 | 1453.6225 | 1.006 |
| http | get_roundtrip | time_ns | 1024 | 80592.8219 | 119290.9801 | 0.676 |
| http | get_roundtrip | alloc_bytes | 1024 | 4217.4677 | 26714.0796 | 0.158 |
| http | get_roundtrip | time_ns | 16384 | 78676.2952 | 96153.8476 | 0.818 |
| http | get_roundtrip | alloc_bytes | 16384 | 34835.8952 | 51458.8381 | 0.677 |
| http | get_roundtrip | time_ns | 262144 | 154360.1600 | 211775.4800 | 0.729 |
| http | get_roundtrip | alloc_bytes | 262144 | 526148.2800 | 800128.7200 | 0.658 |
| http | get_roundtrip | time_ns | 1048576 | 1365614.8800 | 442091.2800 | 3.089 |
| http | get_roundtrip | alloc_bytes | 1048576 | 2099013.0000 | 2695451.6000 | 0.779 |
| headers | get_with_headers | time_ns | 4 | 83332.4350 | 114306.7950 | 0.729 |
| headers | get_with_headers | time_ns | 16 | 89407.2950 | 120143.4000 | 0.744 |
| headers | get_with_headers | time_ns | 64 | 148543.7950 | 160277.2350 | 0.927 |
| deflate | fresh_vs_reused_compressible | time_ns | 1024 | 3215.7600 | 1243.3750 | 2.586 |
| deflate | fresh_vs_reused_compressible | time_ns | 65536 | 60297.4750 | 54413.7250 | 1.108 |
| deflate | fresh_vs_reused_compressible | time_ns | 1048576 | 944859.4000 | 862093.7000 | 1.096 |
| deflate | fresh_vs_reused_incompressible | time_ns | 1024 | 9653.9450 | 7783.8500 | 1.240 |
| deflate | fresh_vs_reused_incompressible | time_ns | 65536 | 1454216.3500 | 1465577.1000 | 0.992 |
| deflate | fresh_vs_reused_incompressible | time_ns | 1048576 | 27125664.6000 | 24680137.7000 | 1.099 |
### Space: cost of one idle connection
| implementation | connections | live KiB/conn | RSS KiB/conn |
|---|---:|---:|---:|
| courierust_event | 65 | 9.94 | 0.94 |
| courierust_blocking | 65 | 32.68 | 16.50 |
| hyper_tokio | 65 | 18.91 | 10.44 |
### Time: selected scaling points
| family | implementation | operation | n (bytes) | ns/op |
|---|---|---|---:|---:|
| codec | courierust | encode_unmasked | 64 | 9.8758 |
| codec | tungstenite | encode_unmasked | 64 | 13.9360 |
| codec | courierust | encode_masked | 64 | 29.9510 |
| codec | tungstenite | encode_masked | 64 | 37.8357 |
| codec | courierust | encode_unmasked | 1024 | 20.6185 |
| codec | tungstenite | encode_unmasked | 1024 | 25.7730 |
| codec | courierust | encode_masked | 1024 | 72.0195 |
| codec | tungstenite | encode_masked | 1024 | 76.8790 |
| codec | courierust | encode_unmasked | 16384 | 5418.1750 |
| codec | tungstenite | encode_unmasked | 16384 | 5423.5900 |
| codec | courierust | encode_masked | 16384 | 922.9250 |
| codec | tungstenite | encode_masked | 16384 | 950.9750 |
| codec | courierust | encode_unmasked | 262144 | 87055.2500 |
| codec | tungstenite | encode_unmasked | 262144 | 87900.3250 |
| codec | courierust | encode_masked | 262144 | 98626.6250 |
| codec | tungstenite | encode_masked | 262144 | 19353.9500 |
| codec | courierust | encode_unmasked | 1048576 | 37588.7750 |
| codec | tungstenite | encode_unmasked | 1048576 | 28807.8500 |
| codec | courierust | encode_masked | 1048576 | 70420.1500 |
| codec | tungstenite | encode_masked | 1048576 | 75246.9250 |
| http | courierust | get_roundtrip | 1024 | 80592.8219 |
| http | reqwest_hyper | get_roundtrip | 1024 | 119290.9801 |
| http | courierust | get_roundtrip | 16384 | 78676.2952 |
| http | reqwest_hyper | get_roundtrip | 16384 | 96153.8476 |
| http | courierust | get_roundtrip | 262144 | 154360.1600 |
| http | reqwest_hyper | get_roundtrip | 262144 | 211775.4800 |
| http | courierust | get_roundtrip | 1048576 | 1365614.8800 |
| http | reqwest_hyper | get_roundtrip | 1048576 | 442091.2800 |
## 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 | 924 | 673 | 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 | 673 | 923 | 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 | 345 | 381 | 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 | 376 | 352 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w1 | 64k | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 1 | 1 | 8926 | 16008 | 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 | 21008 | 8935 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| h2c | h2_multiplex_w8 | 64k | 8 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 4001 | 8 | 8 | 1226 | 16009 | 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 | 18914 | 4213 | 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 | 438 | 16010 | 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 | 16706 | 1318 | 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 | 79 | 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 |
## 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=310.128|rps=12897.9|response_mbps=0.000|p50_us=78.35|p75_us=79.98|p90_us=81.87|p95_us=83.21|p99_us=88.97|min_us=49.45|mean_us=77.35|max_us=104.44|stddev_us=5.25|p999_us=99.01|tail_ratio=1.14|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=308.867|rps=12950.6|response_mbps=13.261|p50_us=79.52|p75_us=82.38|p90_us=84.12|p95_us=85.56|p99_us=91.52|min_us=25.11|mean_us=75.30|max_us=119.26|stddev_us=9.72|p999_us=104.94|tail_ratio=1.15|cv=0.13|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=434.580|rps=9204.3|response_mbps=603.212|p50_us=108.34|p75_us=114.08|p90_us=122.15|p95_us=125.09|p99_us=134.44|min_us=84.38|mean_us=108.87|max_us=155.22|stddev_us=9.94|p999_us=151.72|tail_ratio=1.24|cv=0.09|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=324.374|rps=12331.4|response_mbps=12.627|p50_us=81.28|p75_us=84.69|p90_us=87.98|p95_us=92.64|p99_us=101.98|min_us=54.07|mean_us=81.33|max_us=128.80|stddev_us=7.14|p999_us=113.75|tail_ratio=1.25|cv=0.09|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=126.046|rps=31734.5|response_mbps=32.496|p50_us=105.62|p75_us=137.92|p90_us=176.08|p95_us=203.86|p99_us=263.32|min_us=25.33|mean_us=114.79|max_us=544.06|stddev_us=49.12|p999_us=447.88|tail_ratio=2.49|cv=0.43|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=94.096|rps=42509.7|response_mbps=43.530|p50_us=150.68|p75_us=208.65|p90_us=290.49|p95_us=359.55|p99_us=577.35|min_us=25.50|mean_us=173.94|max_us=2872.59|stddev_us=126.34|p999_us=1304.29|tail_ratio=3.83|cv=0.73|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=394.581|rps=10137.3|response_mbps=10.381|p50_us=99.57|p75_us=101.35|p90_us=111.02|p95_us=115.54|p99_us=120.00|min_us=69.76|mean_us=99.25|max_us=182.77|stddev_us=8.29|p999_us=134.06|tail_ratio=1.21|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=100.732|rps=39709.4|response_mbps=40.662|p50_us=183.47|p75_us=232.88|p90_us=280.66|p95_us=300.40|p99_us=333.39|min_us=95.19|mean_us=198.86|max_us=428.59|stddev_us=52.55|p999_us=373.28|tail_ratio=1.82|cv=0.26|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=924|h2_write_syscalls=673|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=673|h2_write_syscalls=923|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.542|rps=60112.5|response_mbps=61.555|p50_us=483.47|p75_us=514.34|p90_us=753.47|p95_us=860.84|p99_us=927.38|min_us=138.42|mean_us=519.24|max_us=1821.57|stddev_us=150.54|p999_us=1600.88|tail_ratio=1.92|cv=0.29|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=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=345|h2_write_syscalls=381|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=376|h2_write_syscalls=352|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=610.465|rps=6552.4|response_mbps=429.417|p50_us=146.94|p75_us=159.85|p90_us=173.02|p95_us=176.35|p99_us=186.60|min_us=119.07|mean_us=152.75|max_us=427.45|stddev_us=14.06|p999_us=240.31|tail_ratio=1.27|cv=0.09|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=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=1|h2_streams_per_connection_peak=1|h2_read_syscalls=8926|h2_write_syscalls=16008|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=21008|h2_write_syscalls=8935|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=237.022|rps=16876.1|response_mbps=1105.990|p50_us=466.66|p75_us=505.94|p90_us=543.49|p95_us=581.70|p99_us=780.39|min_us=144.30|mean_us=471.65|max_us=2697.33|stddev_us=95.04|p999_us=1003.38|tail_ratio=1.67|cv=0.20|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=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=1226|h2_write_syscalls=16009|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=18914|h2_write_syscalls=4213|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=262.237|rps=15253.4|response_mbps=999.644|p50_us=1964.96|p75_us=2389.20|p90_us=2679.33|p95_us=2982.43|p99_us=3496.31|min_us=162.01|mean_us=2072.58|max_us=3681.60|stddev_us=493.26|p999_us=3616.90|tail_ratio=1.78|cv=0.24|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=438|h2_write_syscalls=16010|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=16706|h2_write_syscalls=1318|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=197.401|rps=10131.6|response_mbps=0.000|p50_us=97.57|p75_us=111.86|p90_us=113.11|p95_us=113.92|p99_us=117.14|min_us=60.44|mean_us=98.63|max_us=203.54|stddev_us=13.26|p999_us=131.86|tail_ratio=1.20|cv=0.13|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=219.399|rps=9115.8|response_mbps=9.335|p50_us=110.63|p75_us=112.66|p90_us=116.51|p95_us=122.98|p99_us=130.20|min_us=82.48|mean_us=109.64|max_us=151.46|stddev_us=7.70|p999_us=143.65|tail_ratio=1.18|cv=0.07|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=885.771|rps=2257.9|response_mbps=147.975|p50_us=427.76|p75_us=449.99|p90_us=472.34|p95_us=534.47|p99_us=549.76|min_us=398.46|mean_us=442.82|max_us=615.83|stddev_us=32.66|p999_us=565.82|tail_ratio=1.29|cv=0.07|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=76.385|rps=26183.0|response_mbps=0.105|p50_us=40.71|p75_us=42.94|p90_us=43.48|p95_us=43.88|p99_us=49.57|min_us=27.84|mean_us=38.10|max_us=75.70|stddev_us=6.10|p999_us=59.10|tail_ratio=1.22|cv=0.16|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=305.175|rps=13107.2|response_mbps=13.422|p50_us=67.37|p75_us=72.51|p90_us=74.67|p95_us=176.41|p99_us=317.31|min_us=41.96|mean_us=76.22|max_us=547.92|stddev_us=49.80|p999_us=451.20|tail_ratio=4.71|cv=0.65|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=558.443|rps=7162.8|response_mbps=7.335|p50_us=140.36|p75_us=142.09|p90_us=146.14|p95_us=191.19|p99_us=254.77|min_us=94.70|mean_us=139.48|max_us=676.02|stddev_us=30.36|p999_us=375.18|tail_ratio=1.82|cv=0.22|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=602.096|rps=6643.5|response_mbps=6.803|p50_us=151.17|p75_us=155.67|p90_us=159.06|p95_us=161.64|p99_us=171.17|min_us=123.82|mean_us=150.44|max_us=207.97|stddev_us=7.94|p999_us=189.92|tail_ratio=1.13|cv=0.05|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=458.147|rps=8730.8|response_mbps=8.940|p50_us=109.59|p75_us=113.50|p90_us=140.23|p95_us=141.43|p99_us=144.21|min_us=93.77|mean_us=114.46|max_us=167.85|stddev_us=12.14|p999_us=154.31|tail_ratio=1.32|cv=0.11|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=56.523|rps=70767.9|response_mbps=72.466|p50_us=95.83|p75_us=134.15|p90_us=175.62|p95_us=202.58|p99_us=311.52|min_us=31.82|mean_us=109.14|max_us=1411.85|stddev_us=67.50|p999_us=746.76|tail_ratio=3.25|cv=0.62|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=163.539|rps=24459.0|response_mbps=25.046|p50_us=326.25|p75_us=345.56|p90_us=365.50|p95_us=381.57|p99_us=494.78|min_us=102.47|mean_us=324.39|max_us=877.22|stddev_us=52.70|p999_us=797.83|tail_ratio=1.52|cv=0.16|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=382.584|rps=10455.2|response_mbps=685.193|p50_us=97.03|p75_us=116.81|p90_us=118.74|p95_us=119.55|p99_us=125.73|min_us=60.47|mean_us=95.58|max_us=198.88|stddev_us=17.69|p999_us=162.68|tail_ratio=1.30|cv=0.19|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=580.612|rps=6889.3|response_mbps=451.496|p50_us=147.21|p75_us=161.69|p90_us=163.42|p95_us=164.35|p99_us=172.83|min_us=106.41|mean_us=145.08|max_us=219.17|stddev_us=16.06|p999_us=188.47|tail_ratio=1.17|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=696.511|rps=5742.9|response_mbps=376.368|p50_us=173.50|p75_us=180.53|p90_us=185.35|p95_us=188.54|p99_us=197.85|min_us=134.46|mean_us=174.04|max_us=411.13|stddev_us=10.41|p999_us=221.78|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=552.263|rps=7242.9|response_mbps=474.672|p50_us=130.90|p75_us=147.45|p90_us=163.49|p95_us=164.49|p99_us=167.72|min_us=106.25|mean_us=137.98|max_us=218.80|stddev_us=15.90|p999_us=194.12|tail_ratio=1.28|cv=0.12|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=435.727|rps=9180.1|response_mbps=9.400|p50_us=108.06|p75_us=110.15|p90_us=118.27|p95_us=122.13|p99_us=127.85|min_us=80.53|mean_us=108.88|max_us=172.11|stddev_us=7.01|p999_us=149.78|tail_ratio=1.18|cv=0.06|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=594.127|rps=6732.6|response_mbps=6.894|p50_us=148.69|p75_us=151.28|p90_us=153.97|p95_us=155.53|p99_us=163.42|min_us=118.87|mean_us=148.43|max_us=198.22|stddev_us=5.39|p999_us=179.31|tail_ratio=1.10|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=532.121|rps=7517.1|response_mbps=7.698|p50_us=133.32|p75_us=135.68|p90_us=137.95|p95_us=139.63|p99_us=148.86|min_us=103.85|mean_us=132.92|max_us=175.91|stddev_us=5.48|p999_us=165.38|tail_ratio=1.12|cv=0.04|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=614.713|rps=6507.1|response_mbps=6.663|p50_us=153.31|p75_us=156.17|p90_us=159.11|p95_us=162.99|p99_us=179.96|min_us=118.24|mean_us=153.58|max_us=1378.88|stddev_us=25.28|p999_us=274.03|tail_ratio=1.17|cv=0.16|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=93.979|rps=42562.9|response_mbps=43.584|p50_us=704.61|p75_us=823.68|p90_us=961.38|p95_us=1077.21|p99_us=1338.61|min_us=77.16|mean_us=711.19|max_us=2274.39|stddev_us=215.25|p999_us=1696.09|tail_ratio=1.90|cv=0.30|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=81.896|rps=48842.4|response_mbps=50.015|p50_us=574.32|p75_us=758.92|p90_us=937.44|p95_us=1080.74|p99_us=1403.79|min_us=87.25|mean_us=607.89|max_us=2561.40|stddev_us=264.64|p999_us=1741.00|tail_ratio=2.44|cv=0.44|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=88.206|rps=45348.2|response_mbps=46.437|p50_us=613.57|p75_us=835.16|p90_us=1039.97|p95_us=1160.94|p99_us=1527.41|min_us=93.40|mean_us=649.87|max_us=2095.35|stddev_us=298.42|p999_us=1983.89|tail_ratio=2.49|cv=0.46|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=119.220|rps=33551.5|response_mbps=34.357|p50_us=219.37|p75_us=276.71|p90_us=347.84|p95_us=398.78|p99_us=542.76|min_us=74.51|mean_us=234.01|max_us=954.86|stddev_us=93.02|p999_us=864.94|tail_ratio=2.47|cv=0.40|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=173.090|rps=23109.3|response_mbps=23.664|p50_us=331.08|p75_us=397.60|p90_us=469.57|p95_us=513.74|p99_us=620.91|min_us=110.39|mean_us=342.12|max_us=920.59|stddev_us=96.50|p999_us=767.38|tail_ratio=1.88|cv=0.28|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=784.297|rps=5100.1|response_mbps=334.241|p50_us=198.17|p75_us=211.57|p90_us=232.18|p95_us=234.72|p99_us=251.16|min_us=115.34|mean_us=196.02|max_us=498.44|stddev_us=27.91|p999_us=264.93|tail_ratio=1.27|cv=0.14|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=723.679|rps=5527.3|response_mbps=362.238|p50_us=180.51|p75_us=183.99|p90_us=190.52|p95_us=197.80|p99_us=215.00|min_us=150.09|mean_us=180.82|max_us=245.55|stddev_us=9.45|p999_us=230.05|tail_ratio=1.19|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=725.220|rps=5515.6|response_mbps=361.468|p50_us=181.66|p75_us=194.21|p90_us=198.36|p95_us=200.03|p99_us=210.94|min_us=146.19|mean_us=181.20|max_us=283.82|stddev_us=13.85|p999_us=226.38|tail_ratio=1.16|cv=0.08|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=731.808|rps=5465.9|response_mbps=358.214|p50_us=182.21|p75_us=185.75|p90_us=191.75|p95_us=198.73|p99_us=216.27|min_us=154.78|mean_us=182.86|max_us=340.94|stddev_us=9.41|p999_us=241.65|tail_ratio=1.19|cv=0.05|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=115.759|rps=552.9|response_mbps=36.233|p50_us=1904.01|p75_us=1968.71|p90_us=2009.30|p95_us=2016.31|p99_us=2031.32|min_us=1586.32|mean_us=1808.66|max_us=2065.74|stddev_us=171.38|p999_us=2065.74|tail_ratio=1.07|cv=0.09|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=66.262|rps=965.9|response_mbps=63.298|p50_us=976.81|p75_us=1016.45|p90_us=1325.32|p95_us=1372.34|p99_us=1537.35|min_us=842.24|mean_us=1035.25|max_us=1537.65|stddev_us=161.84|p999_us=1537.65|tail_ratio=1.57|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=848.883|rps=4712.1|response_mbps=4.825|p50_us=212.29|p75_us=222.53|p90_us=235.18|p95_us=243.59|p99_us=271.58|min_us=147.18|mean_us=212.13|max_us=333.02|stddev_us=20.23|p999_us=292.19|tail_ratio=1.28|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=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=1036.878|rps=3857.7|response_mbps=3.950|p50_us=260.39|p75_us=269.63|p90_us=275.22|p95_us=278.36|p99_us=290.00|min_us=202.83|mean_us=259.13|max_us=350.74|stddev_us=14.14|p999_us=322.61|tail_ratio=1.11|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=3517.255|rps=1137.3|response_mbps=74.531|p50_us=863.23|p75_us=884.73|p90_us=907.32|p95_us=1084.37|p99_us=1221.02|min_us=780.27|mean_us=879.21|max_us=1348.01|stddev_us=78.27|p999_us=1282.07|tail_ratio=1.41|cv=0.09|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=4524.069|rps=884.2|response_mbps=57.944|p50_us=1191.61|p75_us=1211.82|p90_us=1231.10|p95_us=1242.05|p99_us=1270.08|min_us=849.88|mean_us=1130.89|max_us=1373.74|stddev_us=126.30|p999_us=1327.16|tail_ratio=1.07|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=245.13
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=158.59|byte_delay_us=10000|wall_ms=395.55
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.626
RESULT|suite=h3|case=h3_sequential|protocol=h3|mode=reuse|payload=empty|bytes=0|workers=1|requests=1000|elapsed_ms=189.952|rps=5264.5|p50_us=185.6|p75_us=190.8|p90_us=214.9|p99_us=227.2|min_us=153.27|mean_us=189.82|max_us=263.28|stddev_us=13.13|p999_us=242.38|tail_ratio=1.22|cv=0.07|samples=1000
RESULT|suite=h3|case=h3_parallel|protocol=h3|mode=reuse|payload=empty|bytes=0|workers=8|requests=1000|elapsed_ms=54.105|rps=18482.5|p50_us=424.1|p75_us=448.5|p90_us=471.3|p99_us=537.6|min_us=257.08|mean_us=427.60|max_us=834.26|stddev_us=42.99|p999_us=798.83|tail_ratio=1.27|cv=0.10|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=924|h2_write_syscalls=673|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=673|h2_write_syscalls=923|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=0|h2_streams_active_peak=32|h2_streams_per_connection_peak=32|h2_read_syscalls=345|h2_write_syscalls=381|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=376|h2_write_syscalls=352|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=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=1|h2_streams_per_connection_peak=1|h2_read_syscalls=8926|h2_write_syscalls=16008|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=21008|h2_write_syscalls=8935|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=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=1226|h2_write_syscalls=16009|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=18914|h2_write_syscalls=4213|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=438|h2_write_syscalls=16010|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=16706|h2_write_syscalls=1318|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=79|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
~~~
### 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.
~~~