# GitHub Action Benchmark
Generated by the benchmark workflow.
## Run
- Commit: f29369f0f4fcd3ad7f72b545348b74e63d0620bb
- 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: [36989599164](https://github.com/blueokanna/Courierust/actions/runs/36989599164)
## 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 | 19393.4 | 0.000 | 51.35 | 53.90 | 58.27 | 62.51 | 74.41 | 35.08 | 50.91 | 108.40 | 6.94 | 92.89 | 1.45 | 2000 |
| h1_sequential | h1 | sequential | 1k | 1 | 4 | 4000 | 19085.1 | 19.543 | 50.80 | 54.68 | 59.70 | 63.16 | 72.17 | 34.10 | 50.80 | 94.62 | 7.27 | 85.56 | 1.42 | 2000 |
| h1_sequential | h1 | sequential | 64k | 1 | 4 | 4000 | 12127.9 | 794.815 | 82.17 | 90.69 | 97.28 | 100.95 | 113.66 | 42.02 | 82.38 | 504.11 | 16.11 | 179.19 | 1.38 | 2000 |
| h1_parallel_w1 | h1 | parallel | 1k | 1 | 4 | 4000 | 17443.6 | 17.862 | 55.10 | 61.38 | 68.13 | 72.69 | 81.48 | 35.21 | 56.62 | 110.14 | 8.43 | 90.62 | 1.48 | 2000 |
| h1_parallel_w4 | h1 | parallel | 1k | 4 | 4 | 4000 | 51206.1 | 52.435 | 67.87 | 84.99 | 108.21 | 128.59 | 173.94 | 15.12 | 72.71 | 1116.09 | 39.61 | 393.46 | 2.56 | 2000 |
| h1_parallel_w8 | h1 | parallel | 1k | 8 | 8 | 4000 | 71733.5 | 73.455 | 90.76 | 130.12 | 179.67 | 218.29 | 331.69 | 14.33 | 104.17 | 895.89 | 67.77 | 660.47 | 3.65 | 2000 |
| h2_multiplex_w1 | h2c | multiplex | 1k | 1 | 4 | 4000 | 15217.0 | 15.582 | 63.82 | 68.81 | 73.63 | 78.31 | 89.35 | 52.43 | 66.01 | 247.55 | 7.83 | 125.27 | 1.40 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 1k | 8 | 4 | 4000 | 51435.9 | 52.670 | 146.16 | 162.55 | 205.73 | 226.34 | 263.56 | 56.44 | 153.19 | 305.74 | 34.39 | 289.13 | 1.80 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 1k | 32 | 4 | 4000 | 82714.8 | 84.700 | 369.57 | 392.77 | 433.36 | 506.39 | 684.35 | 148.27 | 382.96 | 928.60 | 65.67 | 870.16 | 1.85 | 2016 |
| h2_multiplex_w1 | h2c | multiplex | 64k | 1 | 4 | 4000 | 9427.9 | 617.865 | 104.01 | 111.20 | 119.17 | 128.51 | 147.72 | 81.88 | 106.06 | 284.94 | 12.79 | 205.10 | 1.42 | 2000 |
| h2_multiplex_w8 | h2c | multiplex | 64k | 8 | 4 | 4000 | 21636.0 | 1417.940 | 332.00 | 403.69 | 499.11 | 631.51 | 849.38 | 126.77 | 367.53 | 1256.85 | 120.70 | 1079.55 | 2.56 | 2000 |
| h2_multiplex_w32 | h2c | multiplex | 64k | 32 | 4 | 4000 | 22582.5 | 1479.964 | 1385.54 | 1496.07 | 1640.61 | 1850.57 | 4916.73 | 110.33 | 1413.34 | 5177.22 | 479.68 | 5099.65 | 3.55 | 2016 |
| https_h2_sequential | https+h2 | sequential | empty | 1 | 4 | 2000 | 15510.7 | 0.000 | 61.63 | 64.24 | 75.12 | 85.17 | 96.19 | 54.50 | 64.44 | 293.56 | 9.75 | 110.57 | 1.56 | 2000 |
| https_h2_sequential | https+h2 | sequential | 1k | 1 | 4 | 2000 | 13218.8 | 13.536 | 72.96 | 78.68 | 84.85 | 88.98 | 99.84 | 64.77 | 75.61 | 267.29 | 8.09 | 116.25 | 1.37 | 2000 |
| https_h2_sequential | https+h2 | sequential | 64k | 1 | 4 | 2000 | 2554.3 | 167.399 | 364.96 | 424.27 | 440.26 | 454.55 | 667.09 | 335.43 | 391.44 | 2828.40 | 105.21 | 1889.95 | 1.83 | 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 | 32721.4 | 0.131 | 30.04 | 31.49 | 35.09 | 37.54 | 44.82 | 7.92 | 30.52 | 113.30 | 5.17 | 75.05 | 1.49 | 2000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 25253.8 | 25.860 | 36.99 | 45.07 | 47.62 | 49.48 | 59.83 | 25.36 | 39.54 | 202.36 | 8.00 | 116.28 | 1.62 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 12401.8 | 12.699 | 73.50 | 84.44 | 101.17 | 109.29 | 119.83 | 59.41 | 80.53 | 889.87 | 29.90 | 491.13 | 1.63 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 9618.1 | 9.849 | 102.45 | 108.78 | 115.76 | 120.47 | 133.24 | 76.26 | 103.92 | 459.50 | 11.43 | 177.84 | 1.30 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 13358.1 | 13.679 | 73.19 | 77.43 | 83.58 | 88.25 | 103.85 | 60.01 | 74.79 | 307.95 | 8.73 | 121.85 | 1.42 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 110012.4 | 112.653 | 63.03 | 87.09 | 109.65 | 126.46 | 176.16 | 22.66 | 69.97 | 527.81 | 35.71 | 408.75 | 2.79 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 36325.8 | 37.198 | 215.07 | 230.85 | 253.03 | 274.36 | 344.57 | 67.51 | 218.03 | 674.65 | 41.08 | 621.06 | 1.60 | 4000 |
| courierust_client_to_hyper | client | h1 | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 17699.7 | 1159.967 | 52.65 | 61.55 | 65.93 | 69.33 | 76.94 | 40.18 | 56.46 | 303.24 | 8.23 | 98.12 | 1.46 | 4000 |
| reqwest_client_to_hyper | client | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 11139.8 | 730.055 | 87.72 | 93.27 | 99.85 | 106.07 | 117.27 | 70.80 | 89.73 | 334.76 | 10.35 | 163.50 | 1.34 | 4000 |
| reqwest_client_to_courierust | server | h1 | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7745.5 | 507.607 | 127.28 | 135.99 | 145.26 | 150.76 | 163.47 | 101.96 | 129.05 | 472.62 | 14.24 | 198.39 | 1.28 | 4000 |
| reqwest_client_to_hyper | server | h1 | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 10633.5 | 696.878 | 91.94 | 100.74 | 107.66 | 111.54 | 124.44 | 75.04 | 93.96 | 213.84 | 10.78 | 162.78 | 1.35 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 12431.6 | 12.730 | 78.87 | 84.08 | 90.27 | 94.48 | 109.11 | 61.35 | 80.39 | 280.87 | 9.24 | 152.14 | 1.38 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 9757.8 | 9.992 | 98.70 | 106.94 | 114.30 | 118.88 | 139.76 | 79.95 | 102.29 | 1076.61 | 30.12 | 454.09 | 1.42 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 11548.0 | 11.825 | 85.09 | 89.74 | 96.47 | 101.21 | 110.93 | 67.65 | 86.50 | 785.31 | 14.99 | 139.37 | 1.30 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 1k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 10298.1 | 10.545 | 95.87 | 100.88 | 107.48 | 112.11 | 121.56 | 80.84 | 96.99 | 156.36 | 8.01 | 137.33 | 1.27 | 4000 |
| courierust_h2_conn1xw32 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 57454.1 | 58.833 | 517.30 | 606.31 | 709.87 | 777.73 | 941.08 | 70.88 | 530.97 | 2051.59 | 145.63 | 1157.09 | 1.82 | 4000 |
| courierust_h2_conn4xw8 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 4 | 2 | valid | - | 4000 | 72799.5 | 74.547 | 387.50 | 518.44 | 668.77 | 775.25 | 1017.20 | 62.81 | 414.37 | 1932.65 | 200.63 | 1536.76 | 2.63 | 4000 |
| courierust_h2_conn8xw4 | client | h2c | courierust | hyper | 1k | 32 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 16756.8 | 17.159 | 405.34 | 556.68 | 720.02 | 835.38 | 1288.77 | 49.97 | 489.32 | 200561.60 | 3172.68 | 1864.15 | 3.18 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 1k | 8 | 4 | courierust_max_connections_per_host | 8 | 2 | valid | - | 4000 | 51112.7 | 52.339 | 141.38 | 181.75 | 231.36 | 270.52 | 413.61 | 45.78 | 152.19 | 836.87 | 69.53 | 629.31 | 2.93 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 1k | 8 | 4 | reqwest_pool_max_idle_per_host | 8 | 2 | valid | - | 4000 | 33941.1 | 34.756 | 222.94 | 269.46 | 321.29 | 355.96 | 426.08 | 72.32 | 232.05 | 1058.03 | 68.57 | 522.68 | 1.91 | 4000 |
| courierust_client_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 8757.7 | 573.944 | 112.94 | 119.39 | 127.38 | 132.96 | 149.20 | 90.99 | 114.15 | 544.26 | 14.43 | 199.64 | 1.32 | 4000 |
| reqwest_client_to_hyper | client | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7658.7 | 501.919 | 128.94 | 137.17 | 146.64 | 152.98 | 166.65 | 98.16 | 130.50 | 205.90 | 12.32 | 190.53 | 1.29 | 4000 |
| reqwest_client_to_courierust | server | h2c | reqwest | courierust | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 8408.7 | 551.075 | 117.84 | 126.24 | 134.32 | 140.83 | 154.31 | 96.86 | 118.86 | 181.75 | 12.28 | 169.18 | 1.31 | 4000 |
| reqwest_client_to_hyper | server | h2c | reqwest | hyper | 64k | 1 | 4 | reqwest_pool_max_idle_per_host | 1 | 2 | valid | - | 4000 | 7681.9 | 503.438 | 128.70 | 136.98 | 145.91 | 152.16 | 163.35 | 101.60 | 130.11 | 202.43 | 11.91 | 179.56 | 1.27 | 4000 |
| courierust_h2c_large_body_to_hyper | client | h2c | courierust | hyper | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 64 | 691.8 | 45.337 | 1464.34 | 1488.43 | 1543.99 | 1557.23 | 1608.05 | 1302.74 | 1445.46 | 1633.26 | 77.06 | 1633.26 | 1.10 | 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 | 1278.4 | 83.780 | 792.47 | 821.38 | 870.30 | 909.15 | 930.97 | 660.34 | 782.16 | 944.15 | 68.23 | 944.15 | 1.17 | 64 |
| courierust_h3_client_to_courierust | client | h3 | courierust-h3 | courierust-h3 | 1k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 6467.9 | 6.623 | 153.86 | 168.51 | 182.59 | 189.10 | 203.04 | 88.77 | 154.53 | 465.38 | 21.52 | 226.15 | 1.32 | 4000 |
| quinn_h3_client_to_courierust | client | h3 | quinn+h3 | courierust-h3 | 1k | 1 | 4 | quinn_single_connection | 1 | 2 | valid | - | 4000 | 5770.7 | 5.909 | 170.12 | 181.66 | 194.10 | 203.14 | 231.35 | 135.41 | 173.19 | 601.22 | 19.85 | 305.60 | 1.36 | 4000 |
| courierust_h3_client_to_courierust | client | h3 | courierust-h3 | courierust-h3 | 64k | 1 | 4 | courierust_max_connections_per_host | 1 | 2 | valid | - | 4000 | 1570.0 | 102.891 | 614.50 | 633.85 | 675.66 | 882.54 | 912.10 | 538.31 | 636.84 | 1575.01 | 84.41 | 1089.10 | 1.48 | 4000 |
| quinn_h3_client_to_courierust | client | h3 | quinn+h3 | courierust-h3 | 64k | 1 | 4 | quinn_single_connection | 1 | 2 | valid | - | 4000 | 1272.2 | 83.377 | 818.83 | 872.12 | 922.58 | 943.97 | 977.78 | 572.26 | 785.90 | 1105.38 | 115.04 | 1022.40 | 1.19 | 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 | 1076.22 | - | - | - | - |
| idle_partial_herd | pool | linux | probe_blocked | false | 200 | 2 | na | - | - | - | - |
| slow_sender_herd | event | linux | ok | true | 16 | 2 | 279.53 | probe_ok | 10000 | 16 | 395.24 |
## 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.062 | - | - | - | - | - | - | - | - | - | - | - | - |
| h3_sequential | reuse | 1 | 1000 | 131.956 | - | 7578.3 | 136.1 | 143.7 | 150.5 | 168.0 | 76.33 | 131.89 | 178.21 | 18.27 | 176.30 | 1.23 | 1000 |
| h3_parallel | reuse | 8 | 1000 | 32.097 | - | 31155.5 | 250.0 | 267.8 | 289.1 | 395.8 | 128.89 | 253.16 | 553.41 | 34.50 | 469.64 | 1.58 | 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.28) | 1.283 | 1.696 | 0.058099 | -2117.7292 | 0.9760 | 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.27) | 1.269 | 1.728 | 0.060928 | -2268.1414 | 0.9747 | 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) | 1.073 | 1.238 | 0.105791 | -1768.8558 | 0.9949 | 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^1.24) | 1.242 | 1.574 | 0.144444 | -4670.5072 | 0.9810 | 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.241 | 1.579 | 1.025899 | -4469.1300 | 0.9664 | 4 |
| http | courierust | get_roundtrip | alloc_bytes | O(n) | 0.976 | 0.998 | 1.999774 | 2408.4209 | 1.0000 | 4 |
| http | reqwest_hyper | get_roundtrip | time_ns | O(n^0.37) | 0.370 | 0.556 | 0.313951 | 75439.0679 | 0.9864 | 4 |
| http | reqwest_hyper | get_roundtrip | alloc_bytes | O(n) | 0.941 | 0.990 | 2.793399 | 29387.4408 | 0.9996 | 4 |
| headers | courierust | get_with_headers | time_ns | O(n^0.41) | 0.411 | 0.411 | 1243.075536 | 53365.9583 | 0.9984 | 3 |
| headers | courierust | get_with_headers | alloc_bytes | O(n) | 0.864 | 0.864 | 980.495952 | 4614.5800 | 1.0000 | 3 |
| headers | reqwest_hyper | get_with_headers | time_ns | O(n^0.25) | 0.249 | 0.249 | 643.692679 | 71180.0367 | 0.9941 | 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.993 | 0.993 | 0.833736 | 899.8877 | 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.007 | 1.007 | 0.970059 | 1527.6105 | 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.80) | 0.800 | 0.800 | 0.111598 | 5407.0189 | 0.9999 | 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.25) | 1.246 | 1.246 | 22.111483 | -27503.9853 | 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.17) | 1.175 | 1.175 | 23.847984 | -109199.9295 | 1.0000 | 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 | 8.3195 | 19.4928 | 0.427 |
| codec | encode_unmasked | alloc_bytes | 64 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 64 | 26.6828 | 65.1317 | 0.410 |
| codec | encode_masked | alloc_bytes | 64 | 0.0000 | 64.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 1024 | 15.5680 | 26.8635 | 0.580 |
| codec | encode_unmasked | alloc_bytes | 1024 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 1024 | 81.5770 | 87.9435 | 0.928 |
| codec | encode_masked | alloc_bytes | 1024 | 0.0000 | 1024.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 16384 | 164.7500 | 171.6750 | 0.960 |
| codec | encode_unmasked | alloc_bytes | 16384 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 16384 | 1014.1850 | 544.2150 | 1.864 |
| codec | encode_masked | alloc_bytes | 16384 | 0.0000 | 16384.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 262144 | 5774.1250 | 5793.0750 | 0.997 |
| codec | encode_unmasked | alloc_bytes | 262144 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 262144 | 19880.4250 | 17013.6250 | 1.169 |
| codec | encode_masked | alloc_bytes | 262144 | 0.0000 | 262144.0000 | 0.000 |
| codec | encode_unmasked | time_ns | 1048576 | 60614.8250 | 63572.6250 | 0.953 |
| codec | encode_unmasked | alloc_bytes | 1048576 | 0.0000 | 0.0000 | NaN |
| codec | encode_masked | time_ns | 1048576 | 110663.7500 | 150786.2000 | 0.734 |
| codec | encode_masked | alloc_bytes | 1048576 | 0.0000 | 1048576.0000 | 0.000 |
| codec | utf8_validate | time_ns | 4608 | 1535.2460 | 1509.5215 | 1.017 |
| http | get_roundtrip | time_ns | 1024 | 51858.0896 | 70158.8627 | 0.739 |
| http | get_roundtrip | alloc_bytes | 1024 | 4546.6607 | 26714.0398 | 0.170 |
| http | get_roundtrip | time_ns | 16384 | 63413.7333 | 66007.4476 | 0.961 |
| http | get_roundtrip | alloc_bytes | 16384 | 35192.2667 | 51458.8381 | 0.684 |
| http | get_roundtrip | time_ns | 262144 | 123798.5200 | 184331.2800 | 0.672 |
| http | get_roundtrip | alloc_bytes | 262144 | 526491.1200 | 800131.9200 | 0.658 |
| http | get_roundtrip | time_ns | 1048576 | 1105578.3200 | 398225.8400 | 2.776 |
| http | get_roundtrip | alloc_bytes | 1048576 | 2099360.0000 | 2949235.9200 | 0.712 |
| headers | get_with_headers | time_ns | 4 | 56946.5700 | 75129.7150 | 0.758 |
| headers | get_with_headers | time_ns | 16 | 74994.7800 | 79760.4850 | 0.940 |
| headers | get_with_headers | time_ns | 64 | 132574.8700 | 112720.0950 | 1.176 |
| deflate | fresh_vs_reused_compressible | time_ns | 1024 | 5005.5550 | 1570.6550 | 3.187 |
| deflate | fresh_vs_reused_compressible | time_ns | 65536 | 62453.7250 | 55734.5750 | 1.121 |
| deflate | fresh_vs_reused_compressible | time_ns | 1048576 | 1018871.0000 | 875123.1000 | 1.164 |
| deflate | fresh_vs_reused_incompressible | time_ns | 1024 | 10218.4650 | 7894.4950 | 1.294 |
| deflate | fresh_vs_reused_incompressible | time_ns | 65536 | 1352469.2250 | 1408000.7000 | 0.961 |
| deflate | fresh_vs_reused_incompressible | time_ns | 1048576 | 24903457.7000 | 23158903.4000 | 1.075 |
### Space: cost of one idle connection
| implementation | connections | live KiB/conn | RSS KiB/conn |
|---|---:|---:|---:|
| courierust_event | 65 | 10.04 | 8.44 |
| courierust_blocking | 65 | 32.70 | 16.69 |
| hyper_tokio | 65 | 18.91 | 10.44 |
### Time: selected scaling points
| family | implementation | operation | n (bytes) | ns/op |
|---|---|---|---:|---:|
| codec | courierust | encode_unmasked | 64 | 8.3195 |
| codec | tungstenite | encode_unmasked | 64 | 19.4928 |
| codec | courierust | encode_masked | 64 | 26.6828 |
| codec | tungstenite | encode_masked | 64 | 65.1317 |
| codec | courierust | encode_unmasked | 1024 | 15.5680 |
| codec | tungstenite | encode_unmasked | 1024 | 26.8635 |
| codec | courierust | encode_masked | 1024 | 81.5770 |
| codec | tungstenite | encode_masked | 1024 | 87.9435 |
| codec | courierust | encode_unmasked | 16384 | 164.7500 |
| codec | tungstenite | encode_unmasked | 16384 | 171.6750 |
| codec | courierust | encode_masked | 16384 | 1014.1850 |
| codec | tungstenite | encode_masked | 16384 | 544.2150 |
| codec | courierust | encode_unmasked | 262144 | 5774.1250 |
| codec | tungstenite | encode_unmasked | 262144 | 5793.0750 |
| codec | courierust | encode_masked | 262144 | 19880.4250 |
| codec | tungstenite | encode_masked | 262144 | 17013.6250 |
| codec | courierust | encode_unmasked | 1048576 | 60614.8250 |
| codec | tungstenite | encode_unmasked | 1048576 | 63572.6250 |
| codec | courierust | encode_masked | 1048576 | 110663.7500 |
| codec | tungstenite | encode_masked | 1048576 | 150786.2000 |
| http | courierust | get_roundtrip | 1024 | 51858.0896 |
| http | reqwest_hyper | get_roundtrip | 1024 | 70158.8627 |
| http | courierust | get_roundtrip | 16384 | 63413.7333 |
| http | reqwest_hyper | get_roundtrip | 16384 | 66007.4476 |
| http | courierust | get_roundtrip | 262144 | 123798.5200 |
| http | reqwest_hyper | get_roundtrip | 262144 | 184331.2800 |
| http | courierust | get_roundtrip | 1048576 | 1105578.3200 |
| http | reqwest_hyper | get_roundtrip | 1048576 | 398225.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 | 0 | 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 | 860 | 609 | 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 | 609 | 859 | 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 | 472 | 389 | 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 | 381 | 506 | 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 | 8208 | 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 | 20267 | 8208 | 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 | 1356 | 16008 | 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 | 18333 | 3563 | 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 | 527 | 16012 | 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 | 16274 | 708 | 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 | 83 | 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 | 23 | 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=206.256|rps=19393.4|response_mbps=0.000|p50_us=51.35|p75_us=53.90|p90_us=58.27|p95_us=62.51|p99_us=74.41|min_us=35.08|mean_us=50.91|max_us=108.40|stddev_us=6.94|p999_us=92.89|tail_ratio=1.45|cv=0.14|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=209.587|rps=19085.1|response_mbps=19.543|p50_us=50.80|p75_us=54.68|p90_us=59.70|p95_us=63.16|p99_us=72.17|min_us=34.10|mean_us=50.80|max_us=94.62|stddev_us=7.27|p999_us=85.56|tail_ratio=1.42|cv=0.14|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=329.818|rps=12127.9|response_mbps=794.815|p50_us=82.17|p75_us=90.69|p90_us=97.28|p95_us=100.95|p99_us=113.66|min_us=42.02|mean_us=82.38|max_us=504.11|stddev_us=16.11|p999_us=179.19|tail_ratio=1.38|cv=0.20|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=229.311|rps=17443.6|response_mbps=17.862|p50_us=55.10|p75_us=61.38|p90_us=68.13|p95_us=72.69|p99_us=81.48|min_us=35.21|mean_us=56.62|max_us=110.14|stddev_us=8.43|p999_us=90.62|tail_ratio=1.48|cv=0.15|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=78.116|rps=51206.1|response_mbps=52.435|p50_us=67.87|p75_us=84.99|p90_us=108.21|p95_us=128.59|p99_us=173.94|min_us=15.12|mean_us=72.71|max_us=1116.09|stddev_us=39.61|p999_us=393.46|tail_ratio=2.56|cv=0.54|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=55.762|rps=71733.5|response_mbps=73.455|p50_us=90.76|p75_us=130.12|p90_us=179.67|p95_us=218.29|p99_us=331.69|min_us=14.33|mean_us=104.17|max_us=895.89|stddev_us=67.77|p999_us=660.47|tail_ratio=3.65|cv=0.65|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=262.864|rps=15217.0|response_mbps=15.582|p50_us=63.82|p75_us=68.81|p90_us=73.63|p95_us=78.31|p99_us=89.35|min_us=52.43|mean_us=66.01|max_us=247.55|stddev_us=7.83|p999_us=125.27|tail_ratio=1.40|cv=0.12|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=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=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=77.767|rps=51435.9|response_mbps=52.670|p50_us=146.16|p75_us=162.55|p90_us=205.73|p95_us=226.34|p99_us=263.56|min_us=56.44|mean_us=153.19|max_us=305.74|stddev_us=34.39|p999_us=289.13|tail_ratio=1.80|cv=0.22|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=860|h2_write_syscalls=609|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=609|h2_write_syscalls=859|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=48.359|rps=82714.8|response_mbps=84.700|p50_us=369.57|p75_us=392.77|p90_us=433.36|p95_us=506.39|p99_us=684.35|min_us=148.27|mean_us=382.96|max_us=928.60|stddev_us=65.67|p999_us=870.16|tail_ratio=1.85|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=472|h2_write_syscalls=389|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=381|h2_write_syscalls=506|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=424.274|rps=9427.9|response_mbps=617.865|p50_us=104.01|p75_us=111.20|p90_us=119.17|p95_us=128.51|p99_us=147.72|min_us=81.88|mean_us=106.06|max_us=284.94|stddev_us=12.79|p999_us=205.10|tail_ratio=1.42|cv=0.12|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=8208|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=20267|h2_write_syscalls=8208|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=184.877|rps=21636.0|response_mbps=1417.940|p50_us=332.00|p75_us=403.69|p90_us=499.11|p95_us=631.51|p99_us=849.38|min_us=126.77|mean_us=367.53|max_us=1256.85|stddev_us=120.70|p999_us=1079.55|tail_ratio=2.56|cv=0.33|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=1356|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_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=18333|h2_write_syscalls=3563|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=177.129|rps=22582.5|response_mbps=1479.964|p50_us=1385.54|p75_us=1496.07|p90_us=1640.61|p95_us=1850.57|p99_us=4916.73|min_us=110.33|mean_us=1413.34|max_us=5177.22|stddev_us=479.68|p999_us=5099.65|tail_ratio=3.55|cv=0.34|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=527|h2_write_syscalls=16012|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=16274|h2_write_syscalls=708|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=128.943|rps=15510.7|response_mbps=0.000|p50_us=61.63|p75_us=64.24|p90_us=75.12|p95_us=85.17|p99_us=96.19|min_us=54.50|mean_us=64.44|max_us=293.56|stddev_us=9.75|p999_us=110.57|tail_ratio=1.56|cv=0.15|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=151.300|rps=13218.8|response_mbps=13.536|p50_us=72.96|p75_us=78.68|p90_us=84.85|p95_us=88.98|p99_us=99.84|min_us=64.77|mean_us=75.61|max_us=267.29|stddev_us=8.09|p999_us=116.25|tail_ratio=1.37|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=64k|bytes=65536|workers=1|server_threads=4|requests=2000|elapsed_ms=782.992|rps=2554.3|response_mbps=167.399|p50_us=364.96|p75_us=424.27|p90_us=440.26|p95_us=454.55|p99_us=667.09|min_us=335.43|mean_us=391.44|max_us=2828.40|stddev_us=105.21|p999_us=1889.95|tail_ratio=1.83|cv=0.27|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=61.122|rps=32721.4|response_mbps=0.131|p50_us=30.04|p75_us=31.49|p90_us=35.09|p95_us=37.54|p99_us=44.82|min_us=7.92|mean_us=30.52|max_us=113.30|stddev_us=5.17|p999_us=75.05|tail_ratio=1.49|cv=0.17|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=158.392|rps=25253.8|response_mbps=25.860|p50_us=36.99|p75_us=45.07|p90_us=47.62|p95_us=49.48|p99_us=59.83|min_us=25.36|mean_us=39.54|max_us=202.36|stddev_us=8.00|p999_us=116.28|tail_ratio=1.62|cv=0.20|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=322.534|rps=12401.8|response_mbps=12.699|p50_us=73.50|p75_us=84.44|p90_us=101.17|p95_us=109.29|p99_us=119.83|min_us=59.41|mean_us=80.53|max_us=889.87|stddev_us=29.90|p999_us=491.13|tail_ratio=1.63|cv=0.37|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=415.884|rps=9618.1|response_mbps=9.849|p50_us=102.45|p75_us=108.78|p90_us=115.76|p95_us=120.47|p99_us=133.24|min_us=76.26|mean_us=103.92|max_us=459.50|stddev_us=11.43|p999_us=177.84|tail_ratio=1.30|cv=0.11|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=299.444|rps=13358.1|response_mbps=13.679|p50_us=73.19|p75_us=77.43|p90_us=83.58|p95_us=88.25|p99_us=103.85|min_us=60.01|mean_us=74.79|max_us=307.95|stddev_us=8.73|p999_us=121.85|tail_ratio=1.42|cv=0.12|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=36.360|rps=110012.4|response_mbps=112.653|p50_us=63.03|p75_us=87.09|p90_us=109.65|p95_us=126.46|p99_us=176.16|min_us=22.66|mean_us=69.97|max_us=527.81|stddev_us=35.71|p999_us=408.75|tail_ratio=2.79|cv=0.51|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=110.115|rps=36325.8|response_mbps=37.198|p50_us=215.07|p75_us=230.85|p90_us=253.03|p95_us=274.36|p99_us=344.57|min_us=67.51|mean_us=218.03|max_us=674.65|stddev_us=41.08|p999_us=621.06|tail_ratio=1.60|cv=0.19|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=225.993|rps=17699.7|response_mbps=1159.967|p50_us=52.65|p75_us=61.55|p90_us=65.93|p95_us=69.33|p99_us=76.94|min_us=40.18|mean_us=56.46|max_us=303.24|stddev_us=8.23|p999_us=98.12|tail_ratio=1.46|cv=0.15|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=359.074|rps=11139.8|response_mbps=730.055|p50_us=87.72|p75_us=93.27|p90_us=99.85|p95_us=106.07|p99_us=117.27|min_us=70.80|mean_us=89.73|max_us=334.76|stddev_us=10.35|p999_us=163.50|tail_ratio=1.34|cv=0.12|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=516.431|rps=7745.5|response_mbps=507.607|p50_us=127.28|p75_us=135.99|p90_us=145.26|p95_us=150.76|p99_us=163.47|min_us=101.96|mean_us=129.05|max_us=472.62|stddev_us=14.24|p999_us=198.39|tail_ratio=1.28|cv=0.11|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=376.169|rps=10633.5|response_mbps=696.878|p50_us=91.94|p75_us=100.74|p90_us=107.66|p95_us=111.54|p99_us=124.44|min_us=75.04|mean_us=93.96|max_us=213.84|stddev_us=10.78|p999_us=162.78|tail_ratio=1.35|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=321.761|rps=12431.6|response_mbps=12.730|p50_us=78.87|p75_us=84.08|p90_us=90.27|p95_us=94.48|p99_us=109.11|min_us=61.35|mean_us=80.39|max_us=280.87|stddev_us=9.24|p999_us=152.14|tail_ratio=1.38|cv=0.11|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=409.930|rps=9757.8|response_mbps=9.992|p50_us=98.70|p75_us=106.94|p90_us=114.30|p95_us=118.88|p99_us=139.76|min_us=79.95|mean_us=102.29|max_us=1076.61|stddev_us=30.12|p999_us=454.09|tail_ratio=1.42|cv=0.29|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=346.379|rps=11548.0|response_mbps=11.825|p50_us=85.09|p75_us=89.74|p90_us=96.47|p95_us=101.21|p99_us=110.93|min_us=67.65|mean_us=86.50|max_us=785.31|stddev_us=14.99|p999_us=139.37|tail_ratio=1.30|cv=0.17|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=388.420|rps=10298.1|response_mbps=10.545|p50_us=95.87|p75_us=100.88|p90_us=107.48|p95_us=112.11|p99_us=121.56|min_us=80.84|mean_us=96.99|max_us=156.36|stddev_us=8.01|p999_us=137.33|tail_ratio=1.27|cv=0.08|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=69.621|rps=57454.1|response_mbps=58.833|p50_us=517.30|p75_us=606.31|p90_us=709.87|p95_us=777.73|p99_us=941.08|min_us=70.88|mean_us=530.97|max_us=2051.59|stddev_us=145.63|p999_us=1157.09|tail_ratio=1.82|cv=0.27|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=54.945|rps=72799.5|response_mbps=74.547|p50_us=387.50|p75_us=518.44|p90_us=668.77|p95_us=775.25|p99_us=1017.20|min_us=62.81|mean_us=414.37|max_us=1932.65|stddev_us=200.63|p999_us=1536.76|tail_ratio=2.63|cv=0.48|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=238.708|rps=16756.8|response_mbps=17.159|p50_us=405.34|p75_us=556.68|p90_us=720.02|p95_us=835.38|p99_us=1288.77|min_us=49.97|mean_us=489.32|max_us=200561.60|stddev_us=3172.68|p999_us=1864.15|tail_ratio=3.18|cv=6.48|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=78.258|rps=51112.7|response_mbps=52.339|p50_us=141.38|p75_us=181.75|p90_us=231.36|p95_us=270.52|p99_us=413.61|min_us=45.78|mean_us=152.19|max_us=836.87|stddev_us=69.53|p999_us=629.31|tail_ratio=2.93|cv=0.46|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=117.851|rps=33941.1|response_mbps=34.756|p50_us=222.94|p75_us=269.46|p90_us=321.29|p95_us=355.96|p99_us=426.08|min_us=72.32|mean_us=232.05|max_us=1058.03|stddev_us=68.57|p999_us=522.68|tail_ratio=1.91|cv=0.30|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=456.741|rps=8757.7|response_mbps=573.944|p50_us=112.94|p75_us=119.39|p90_us=127.38|p95_us=132.96|p99_us=149.20|min_us=90.99|mean_us=114.15|max_us=544.26|stddev_us=14.43|p999_us=199.64|tail_ratio=1.32|cv=0.13|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=522.284|rps=7658.7|response_mbps=501.919|p50_us=128.94|p75_us=137.17|p90_us=146.64|p95_us=152.98|p99_us=166.65|min_us=98.16|mean_us=130.50|max_us=205.90|stddev_us=12.32|p999_us=190.53|tail_ratio=1.29|cv=0.09|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=475.696|rps=8408.7|response_mbps=551.075|p50_us=117.84|p75_us=126.24|p90_us=134.32|p95_us=140.83|p99_us=154.31|min_us=96.86|mean_us=118.86|max_us=181.75|stddev_us=12.28|p999_us=169.18|tail_ratio=1.31|cv=0.10|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=520.707|rps=7681.9|response_mbps=503.438|p50_us=128.70|p75_us=136.98|p90_us=145.91|p95_us=152.16|p99_us=163.35|min_us=101.60|mean_us=130.11|max_us=202.43|stddev_us=11.91|p999_us=179.56|tail_ratio=1.27|cv=0.09|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=92.513|rps=691.8|response_mbps=45.337|p50_us=1464.34|p75_us=1488.43|p90_us=1543.99|p95_us=1557.23|p99_us=1608.05|min_us=1302.74|mean_us=1445.46|max_us=1633.26|stddev_us=77.06|p999_us=1633.26|tail_ratio=1.10|cv=0.05|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=50.063|rps=1278.4|response_mbps=83.780|p50_us=792.47|p75_us=821.38|p90_us=870.30|p95_us=909.15|p99_us=930.97|min_us=660.34|mean_us=782.16|max_us=944.15|stddev_us=68.23|p999_us=944.15|tail_ratio=1.17|cv=0.09|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=618.434|rps=6467.9|response_mbps=6.623|p50_us=153.86|p75_us=168.51|p90_us=182.59|p95_us=189.10|p99_us=203.04|min_us=88.77|mean_us=154.53|max_us=465.38|stddev_us=21.52|p999_us=226.15|tail_ratio=1.32|cv=0.14|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=693.153|rps=5770.7|response_mbps=5.909|p50_us=170.12|p75_us=181.66|p90_us=194.10|p95_us=203.14|p99_us=231.35|min_us=135.41|mean_us=173.19|max_us=601.22|stddev_us=19.85|p999_us=305.60|tail_ratio=1.36|cv=0.11|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=2547.776|rps=1570.0|response_mbps=102.891|p50_us=614.50|p75_us=633.85|p90_us=675.66|p95_us=882.54|p99_us=912.10|min_us=538.31|mean_us=636.84|max_us=1575.01|stddev_us=84.41|p999_us=1089.10|tail_ratio=1.48|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=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=3144.080|rps=1272.2|response_mbps=83.377|p50_us=818.83|p75_us=872.12|p90_us=922.58|p95_us=943.97|p99_us=977.78|min_us=572.26|mean_us=785.90|max_us=1105.38|stddev_us=115.04|p999_us=1022.40|tail_ratio=1.19|cv=0.15|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=1076.22
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=279.53|byte_delay_us=10000|wall_ms=395.24
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.062
RESULT|suite=h3|case=h3_sequential|protocol=h3|mode=reuse|payload=empty|bytes=0|workers=1|requests=1000|elapsed_ms=131.956|rps=7578.3|p50_us=136.1|p75_us=143.7|p90_us=150.5|p99_us=168.0|min_us=76.33|mean_us=131.89|max_us=178.21|stddev_us=18.27|p999_us=176.30|tail_ratio=1.23|cv=0.14|samples=1000
RESULT|suite=h3|case=h3_parallel|protocol=h3|mode=reuse|payload=empty|bytes=0|workers=8|requests=1000|elapsed_ms=32.097|rps=31155.5|p50_us=250.0|p75_us=267.8|p90_us=289.1|p99_us=395.8|min_us=128.89|mean_us=253.16|max_us=553.41|stddev_us=34.50|p999_us=469.64|tail_ratio=1.58|cv=0.14|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=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=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=860|h2_write_syscalls=609|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=609|h2_write_syscalls=859|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=472|h2_write_syscalls=389|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=381|h2_write_syscalls=506|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=8208|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=20267|h2_write_syscalls=8208|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=1356|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_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=18333|h2_write_syscalls=3563|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=527|h2_write_syscalls=16012|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=16274|h2_write_syscalls=708|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=83|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=23|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.
~~~