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.
Temporary performance-profile hold for final matrices; CPU clocks sampled per run.
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
Power profile: performance
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         25,686       3.74           0     0             0      55.2 25,610-26,172
fastapi_json      skirr             24,085       5.28           0     0             0      38.0 24,001-24,301
fastapi_json      skirr-before      23,896       5.31           0     0             0      38.0 23,867-23,912
fastapi_json      weft              23,855       4.72           0     0             0      39.6 23,812-23,950
get_64k           peregrine         72,836       1.89           0     0             0      32.8 72,383-72,858
get_64k           skirr             81,665       1.79           0     0             0      17.2 81,613-82,607
get_64k           skirr-before      79,804       1.62           0     0             0      17.3 79,153-80,145
get_64k           weft              65,162       1.87           0     0             0      22.3 64,972-65,174
post_4k           peregrine        165,069       1.14           0     0             0      33.4 162,469-166,791
post_4k           skirr            162,582       0.87           0     0             0      17.2 162,192-163,829
post_4k           skirr-before     146,976       1.35           0     0             0      17.3 145,502-148,458
post_4k           weft             136,312       1.08           0     0             0      19.7 136,043-138,392
raw_get           peregrine        206,813       0.84           0     0             0      33.0 203,419-207,816
raw_get           skirr            213,732       1.03           0     0             0      17.1 213,276-217,278
raw_get           skirr-before     196,842       0.74           0     0             0      17.3 194,844-197,085
raw_get           weft             169,105       1.13           0     0             0      18.4 163,985-169,527

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4447; 4200-4700
skirr         4454; 4200-4700
skirr-before  4451; 4200-4700
weft          4429; 4166-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +0.8%; versus Weft +1.0%; versus Peregrine -6.2%
get_64k           +2.3%; versus Weft +25.3%; versus Peregrine +12.1%
post_4k           +10.6%; versus Weft +19.3%; versus Peregrine -1.5%
raw_get           +8.6%; versus Weft +26.4%; versus Peregrine +3.3%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr      first-byte 0.637ms; total 50.746ms
weft       first-byte 0.522ms; total 51.739ms
peregrine  first-byte 0.336ms; total 50.498ms
skirr-before first-byte 0.472ms; total 50.594ms

Raw artifact: bench/results/peregrine-round2-c64/results.json

Connections: 256
Power profile: performance
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         25,672      14.64           0     0             0      56.4 25,608-25,776
fastapi_json      skirr             23,960      17.41           0     0             0      38.0 23,915-24,150
fastapi_json      skirr-before      23,636      17.76           0     0             0      38.0 23,385-23,650
fastapi_json      weft              23,990      16.95           0     0             0      44.3 23,930-24,081
get_64k           peregrine         70,308       5.28           0     0             0      35.8 70,283-70,495
get_64k           skirr             78,822       5.08           0     0             0      18.1 78,768-79,859
get_64k           skirr-before      76,716       5.63           0     0             0      18.2 76,391-76,842
get_64k           weft              54,741       7.30           0     0             0      39.6 54,324-55,144
post_4k           peregrine        157,020       2.90           0     0             0      38.7 155,884-157,405
post_4k           skirr            163,850       2.61           0     0             0      18.1 162,442-164,512
post_4k           skirr-before     146,976       2.85           0     0             0      18.2 146,455-147,200
post_4k           weft             133,698       3.07           0     0             0      28.4 133,267-134,326
raw_get           peregrine        207,066       2.35           0     0             0      35.9 204,941-208,996
raw_get           skirr            219,705       2.21           0     0             0      17.2 216,631-220,982
raw_get           skirr-before     201,497       2.08           0     0             0      18.2 199,502-202,101
raw_get           weft             174,922       3.11           0     0             0      23.3 174,636-176,387

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4258; 399-4687
skirr         4311; 399-4700
skirr-before  4303; 400-4700
weft          4311; 399-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +1.4%; versus Weft -0.1%; versus Peregrine -6.7%
get_64k           +2.7%; versus Weft +44.0%; versus Peregrine +12.1%
post_4k           +11.5%; versus Weft +22.6%; versus Peregrine +4.3%
raw_get           +9.0%; versus Weft +25.6%; versus Peregrine +6.1%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr      first-byte 0.622ms; total 50.734ms
weft       first-byte 0.659ms; total 51.886ms
peregrine  first-byte 0.352ms; total 50.506ms
skirr-before first-byte 0.331ms; total 50.519ms

Raw artifact: bench/results/peregrine-round2-c256/results.json

Total completed requests across these comparisons: 54,257,980

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