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