Skirr prototype: local HTTP/1 comparison

One worker pinned to CPU 0; wrk on CPUs 4-7; identical apps and Python.
Access logs, request IDs, compression, caches and lifespan disabled.
Server allocator/GC defaults retained; Skirr does not alter application GC policy.
Medians of three five-second runs, each preceded by one-second warmup.
CPU governor/energy settings unchanged; shared laptop with dynamic clocks.
No TLS, HTTP/2, WebSockets or pipelining in the throughput workload.
Exact body/status checked before/after each run, not on every wrk response.
P99 below is median per-run wrk P99, not a pooled percentile.
Timeout counter includes completed responses outside the 3s histogram.
These measurements do not establish production readiness or general superiority.

Connections: 64
Versions: {"fastapi": "0.143.1", "peregrine-server": "1.1.7", "uvloop": "0.23.0", "weft-server": "0.1.0"}
Workload          Server          Req/s     P99 ms   IO failures  >3s   HTTP errors   PSS MiB   RPS range
fastapi_json      peregrine          9,429       9.33           0     0             0      55.4 9,392-9,496
fastapi_json      skirr              8,669      14.39           0     0             0      38.3 8,653-8,671
fastapi_json      skirr-before       8,379      12.51           0     0             0      38.6 8,326-8,469
fastapi_json      weft               8,785      11.40           0     0             0      39.9 8,653-8,877
get_64k           peregrine         28,133       3.52           0     0             0      33.3 28,031-28,289
get_64k           skirr             30,089       4.52           0     0             0      17.6 29,813-30,191
get_64k           skirr-before      22,329       5.04           0     0             0      21.5 22,150-22,522
get_64k           weft              24,932       4.87           0     0             0      22.7 24,850-25,331
post_4k           peregrine         59,103       3.22           0     0             0      33.8 59,067-59,566
post_4k           skirr             51,469       2.54           0     0             0      17.6 50,941-52,028
post_4k           skirr-before      43,271       2.44           0     0             0      18.2 42,910-43,601
post_4k           weft              48,848       2.43           0     0             0      20.0 48,841-49,242
raw_get           peregrine         74,589       1.65           0     0             0      33.3 73,889-75,095
raw_get           skirr             68,621       1.90           0     0             0      17.6 68,507-68,950
raw_get           skirr-before      52,749       2.20           0     0             0      17.5 52,122-52,878
raw_get           weft              60,855       2.08           0     0             0      18.7 60,432-61,487

Optimized Skirr change versus same-session original:
fastapi_json      +3.5%; versus Weft -1.3%; versus Peregrine -8.1%
get_64k           +34.8%; versus Weft +20.7%; versus Peregrine +7.0%
post_4k           +18.9%; versus Weft +5.4%; versus Peregrine -12.9%
raw_get           +30.1%; versus Weft +12.8%; versus Peregrine -8.0%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr-before first-byte 1.259ms; total 51.503ms
weft       first-byte 1.232ms; total 52.463ms
peregrine  first-byte 1.088ms; total 51.376ms
skirr      first-byte 1.065ms; total 51.439ms

Raw artifact: bench/results/optimization-c64/results.json

Connections: 256
Versions: {"fastapi": "0.143.1", "peregrine-server": "1.1.7", "uvloop": "0.23.0", "weft-server": "0.1.0"}
Workload          Server          Req/s     P99 ms   IO failures  >3s   HTTP errors   PSS MiB   RPS range
fastapi_json      peregrine          9,053      40.78           0     0             0      56.7 8,814-9,390
fastapi_json      skirr              8,457      42.89           0     0             0      38.4 8,415-8,502
fastapi_json      skirr-before       8,165      44.42           0     0             0      39.3 8,087-8,174
fastapi_json      weft               8,672      41.78           0     0             0      42.8 8,648-8,750
get_64k           peregrine         26,493      16.25           0     0             0      36.3 25,545-26,776
get_64k           skirr             30,712      13.94           0     0             0      18.5 28,874-31,375
get_64k           skirr-before      20,945      23.53           0     0             0      34.3 19,327-21,198
get_64k           weft              24,534      18.91           0     0             0      39.3 23,465-25,061
post_4k           peregrine         60,530       7.94           0     0             0      38.9 60,480-63,846
post_4k           skirr             52,584       9.14           0     0             0      18.5 50,550-54,610
post_4k           skirr-before      37,587      11.34           0     0             0      20.7 36,754-38,010
post_4k           weft              48,696       8.95           0     0             0      28.7 48,377-50,107
raw_get           peregrine         77,737       6.29           0     0             0      36.0 76,825-77,848
raw_get           skirr             72,552       7.20           0     0             0      18.5 67,328-73,692
raw_get           skirr-before      50,283       8.66           0     0             0      18.0 48,780-50,360
raw_get           weft              64,725       7.73           0     0             0      23.3 62,059-65,168

Optimized Skirr change versus same-session original:
fastapi_json      +3.6%; versus Weft -2.5%; versus Peregrine -6.6%
get_64k           +46.6%; versus Weft +25.2%; versus Peregrine +15.9%
post_4k           +39.9%; versus Weft +8.0%; versus Peregrine -13.1%
raw_get           +44.3%; versus Weft +12.1%; versus Peregrine -6.7%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr-before first-byte 1.243ms; total 51.586ms
weft       first-byte 1.185ms; total 52.630ms
peregrine  first-byte 1.144ms; total 51.444ms
skirr      first-byte 1.138ms; total 51.338ms

Raw artifact: bench/results/optimization-c256/results.json

Total completed requests across these comparisons: 18,205,628

wrk histogram counter behavior: https://github.com/wg/wrk/blob/4.1.0/src/wrk.c#L301-L325