HTTP Server Benchmark Report

Counter application — single-threaded, 10s per concurrency level, wrk load generator

Fastest
Rust
407,045 req/s (axum + tokio)
Runner-up
letloop
305,820 req/s (flow2 + io_uring)
Lowest p99
Rust
0.014ms
Implementations
6
languages tested

Peak Throughput Rankings

# Language Framework Peak req/s @ conns Avg (ms) p99 (ms)
1 Rust axum + tokio 407,045 8 0.019 0.029
2 letloop flow2 + io_uring 305,820 16 0.052 0.083
3 Bun (canary) Bun.serve() (canary, Rust) 302,935 32 0.106 0.189
4 Bun Bun.serve() 294,188 8 0.028 0.093
5 Node.js http (stdlib) 192,297 8 0.044 0.079
6 FastAPI uvicorn 36,096 64 1.77 1.80

Scaling Data

Rust axum + tokio

ConnsReq/sAvg (ms)p99 (ms)
1163,7010.0120.019
2348,0200.0070.014
4393,9520.0110.019
8407,0450.0190.029
16389,5570.0420.058
32377,9970.0840.106
64372,4980.1680.188
128358,2740.3250.394
256346,9810.6730.87

letloop flow2 + io_uring

ConnsReq/sAvg (ms)p99 (ms)
1131,7310.0140.033
2212,0460.0120.023
4232,3570.0180.033
8244,4930.0330.054
16305,8200.0520.083
32300,0970.1050.155
64288,2060.2170.319
128272,6090.4270.617
256233,9481.001.79

Bun (canary) Bun.serve() (canary, Rust)

ConnsReq/sAvg (ms)p99 (ms)
1169,5650.0080.035
2231,6790.0110.045
4267,3340.0170.057
8288,1920.0290.074
16300,4010.0540.109
32302,9350.1060.189
64300,8270.2480.311
128288,4580.4160.580
256291,2890.8371.04

Bun Bun.serve()

ConnsReq/sAvg (ms)p99 (ms)
1150,9250.0110.067
2256,4460.0090.064
4284,9690.0160.072
8294,1880.0280.093
16292,4210.0560.145
32291,6090.1100.217
64288,5030.2280.364
128285,7370.4240.588
256277,0670.861.15

Node.js http (stdlib)

ConnsReq/sAvg (ms)p99 (ms)
1132,8960.0110.031
2184,7370.0140.040
4187,9920.0270.054
8192,2970.0440.079
16188,3350.0890.131
32180,9020.1820.235
64175,7010.3870.457
128164,9150.7790.90
256160,0342.012.05

FastAPI uvicorn

ConnsReq/sAvg (ms)p99 (ms)
133,0810.0300.040
233,1450.0640.103
433,9640.1190.211
834,7760.2320.389
1635,0480.4560.482
3235,6750.900.94
6436,0961.771.80
12835,8083.593.48
25632,57113.17273.48

Top 5 by Concurrency Level

Connections 1st 2nd 3rd 4th 5th
1
1Bun (canary)169,565 req/s
2Rust163,701 req/s
3Bun150,925 req/s
4Node.js132,896 req/s
5letloop131,731 req/s
2
1Rust348,020 req/s
2Bun256,446 req/s
3Bun (canary)231,679 req/s
4letloop212,046 req/s
5Node.js184,737 req/s
4
1Rust393,952 req/s
2Bun284,969 req/s
3Bun (canary)267,334 req/s
4letloop232,357 req/s
5Node.js187,992 req/s
8
1Rust407,045 req/s
2Bun294,188 req/s
3Bun (canary)288,192 req/s
4letloop244,493 req/s
5Node.js192,297 req/s
16
1Rust389,557 req/s
2letloop305,820 req/s
3Bun (canary)300,401 req/s
4Bun292,421 req/s
5Node.js188,335 req/s
32
1Rust377,997 req/s
2Bun (canary)302,935 req/s
3letloop300,097 req/s
4Bun291,609 req/s
5Node.js180,902 req/s
64
1Rust372,498 req/s
2Bun (canary)300,827 req/s
3Bun288,503 req/s
4letloop288,206 req/s
5Node.js175,701 req/s
128
1Rust358,274 req/s
2Bun (canary)288,458 req/s
3Bun285,737 req/s
4letloop272,609 req/s
5Node.js164,915 req/s
256
1Rust346,981 req/s
2Bun (canary)291,289 req/s
3Bun277,067 req/s
4letloop233,948 req/s
5Node.js160,034 req/s