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