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.
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,455 10.31 0 0 0 55.3 9,362-9,524
fastapi_json skirr 8,404 12.66 0 0 0 38.5 8,273-8,523
fastapi_json weft 8,906 8.03 0 0 0 39.8 8,738-8,978
get_64k peregrine 27,724 5.04 0 0 0 32.9 26,045-27,806
get_64k skirr 21,538 5.46 0 0 0 21.6 20,625-22,193
get_64k weft 24,234 4.41 0 0 0 22.7 23,687-24,892
post_4k peregrine 59,766 2.21 0 0 0 33.7 59,382-62,283
post_4k skirr 42,883 2.90 0 0 0 18.2 42,371-43,153
post_4k weft 50,616 1.97 0 0 0 19.9 49,375-50,628
raw_get peregrine 74,748 1.73 0 0 0 32.9 74,726-75,048
raw_get skirr 53,051 1.96 0 0 0 18.2 52,343-53,236
raw_get weft 61,761 1.54 0 0 0 18.4 60,501-63,526
Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr first-byte 1.106ms; total 51.379ms
peregrine first-byte 1.223ms; total 51.487ms
weft first-byte 1.119ms; total 52.744ms
Raw artifact: bench/results/review2-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,292 39.80 0 0 0 56.5 9,124-9,307
fastapi_json skirr 8,267 43.90 0 0 0 39.2 8,113-8,360
fastapi_json weft 8,904 40.73 0 0 0 42.6 8,684-8,943
get_64k peregrine 26,622 15.41 0 0 0 34.0 26,066-28,214
get_64k skirr 20,879 23.66 0 0 0 34.3 20,360-20,928
get_64k weft 24,102 17.65 0 0 0 40.2 23,927-24,925
post_4k peregrine 63,516 7.20 0 0 0 38.9 60,931-64,033
post_4k skirr 37,584 11.79 0 0 0 20.4 37,425-38,542
post_4k weft 49,549 8.95 0 0 0 28.2 47,224-50,492
raw_get peregrine 77,425 6.06 0 0 0 34.0 76,735-78,045
raw_get skirr 49,107 10.02 0 0 0 20.3 48,612-49,606
raw_get weft 65,183 7.05 0 0 0 23.4 61,237-65,850
Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr first-byte 1.103ms; total 51.363ms
peregrine first-byte 1.147ms; total 51.427ms
weft first-byte 1.162ms; total 52.670ms
Raw artifact: bench/results/review2-c256/results.json
Total completed requests across these comparisons: 13,363,198
wrk histogram counter behavior: https://github.com/wg/wrk/blob/4.1.0/src/wrk.c#L301-L325