HTTP Server Benchmark Report

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

Fastest
C (h2o)
411,965 req/s (libh2o-evloop)
Runner-up
Rust
316,506 req/s (axum + tokio)
Lowest p99
C (h2o)
0.009ms
Implementations
15
languages tested

Peak Throughput Rankings

# Language Framework Peak req/s @ conns Avg (ms) p99 (ms)
1 C (h2o) libh2o-evloop 411,965 8 0.017 0.028
2 Rust axum + tokio 316,506 8 0.026 0.039
3 Java (Vert.x) Vert.x 277,621 8 0.099 2.47
4 Bun Bun.serve() 230,697 8 0.036 0.130
5 Scheme pico + io_uring 222,365 16 0.071 0.110
6 Deno Deno.serve() 208,723 8 0.039 0.086
7 Go net/http (stdlib) 178,119 8 0.047 0.137
8 Node.js http (stdlib) 141,993 8 0.063 0.126
9 Gleam mist + gleam_otp 88,743 2 0.023 0.033
10 Common Lisp Hunchentoot 48,918 8 0.155 0.250
11 FastAPI uvicorn 47,968 64 1.33 1.75
12 Java (Loom) HttpServer + virtual threads 44,662 256 11.43 42.27
13 Ruby Falcon (async) 32,800 16 0.486 0.771
14 Racket web-server (stdlib) 30,849 16 0.733 1.89
15 Flask gunicorn (1 worker) 11,956 8 0.660 0.812

Scaling Data

C (h2o) libh2o-evloop

ConnsReq/sAvg (ms)p99 (ms)
1144,6720.0070.009
2342,4650.0060.009
4391,2040.0100.014
8411,9650.0170.028
16397,6690.0791.81
32379,9930.0840.163
64385,2520.1620.317
128370,1070.3160.578
256370,0450.6700.87

Rust axum + tokio

ConnsReq/sAvg (ms)p99 (ms)
1126,1940.0100.026
2278,7560.0090.014
4308,8410.0140.029
8316,5060.0260.039
16298,9830.0560.106
32294,9220.1090.155
64296,6260.2120.283
128284,8610.4100.503
256279,6360.8361.03

Java (Vert.x) Vert.x

ConnsReq/sAvg (ms)p99 (ms)
1126,3090.0551.82
2241,4910.0922.52
4265,3600.1032.59
8277,6210.0992.47
16269,7090.1402.59
32274,9200.1772.41
64266,4810.3192.91
128259,2990.5583.69
256246,1701.074.56

Bun Bun.serve()

ConnsReq/sAvg (ms)p99 (ms)
1119,3580.0100.082
2200,2610.0120.098
4222,1700.0190.094
8230,6970.0360.130
16226,2570.0730.216
32226,2970.1420.317
64230,1070.2840.445
128222,5550.5400.810
256220,4141.091.41

Scheme pico + io_uring

ConnsReq/sAvg (ms)p99 (ms)
1108,3970.0110.027
2161,1050.0140.032
4209,9660.0190.037
8215,6180.0360.061
16222,3650.0710.110
32221,3820.1430.211
64212,6700.2940.412
128211,2760.5500.687
256204,9601.131.39

Deno Deno.serve()

ConnsReq/sAvg (ms)p99 (ms)
191,3230.0120.038
2159,8760.0140.046
4175,6720.0240.071
8208,7230.0390.086
16203,2720.0790.142
32198,1070.1620.253
64190,7160.3400.495
128184,1910.6420.88
256185,2781.261.67

Go net/http (stdlib)

ConnsReq/sAvg (ms)p99 (ms)
1108,3640.0100.032
2173,8980.0130.054
4177,2250.0250.085
8178,1190.0470.137
16170,1070.0980.258
32167,0420.1950.472
64165,2630.3870.88
128159,5200.7441.62
256153,4731.542.76

Node.js http (stdlib)

ConnsReq/sAvg (ms)p99 (ms)
1109,2490.0140.047
2136,4100.0210.061
4138,7150.0370.096
8141,9930.0630.126
16141,0280.1210.206
32139,6510.2390.371
64135,5040.5040.722
128134,3331.001.51
256131,6662.639.66

Gleam mist + gleam_otp

ConnsReq/sAvg (ms)p99 (ms)
159,0270.0180.045
288,7430.0230.033
485,9890.0480.079
886,7580.0920.143
1686,6390.1840.236
3285,7340.3730.467
6484,9550.7560.97
12882,9561.431.75
25683,2573.053.36

Common Lisp Hunchentoot

ConnsReq/sAvg (ms)p99 (ms)
132,9390.0220.045
248,7700.0340.092
448,7890.0750.158
848,9180.1550.250
1648,4290.3220.512
3247,9930.6510.811
6447,8934.1055.14
12825,18237.95615.11
25632,27428.74615.62

FastAPI uvicorn

ConnsReq/sAvg (ms)p99 (ms)
136,6320.0280.038
243,5340.0460.060
443,5010.0910.118
844,9930.1770.249
1646,7460.3410.613
3246,2230.6930.809
6447,9681.331.75
12846,8452.704.77
25647,5647.98130.03

Java (Loom) HttpServer + virtual threads

ConnsReq/sAvg (ms)p99 (ms)
12441.0444.08
24940.9943.91
49740.9843.03
819541.0444.00
1638841.0744.56
3277741.1244.97
641,51741.1644.05
1282,80241.1544.96
25644,66211.4342.27

Ruby Falcon (async)

ConnsReq/sAvg (ms)p99 (ms)
129,4380.0380.226
230,5350.0690.291
431,4920.1300.384
832,0030.2500.522
1632,8000.4860.771
3232,7320.971.32
6431,0332.072.41
12829,1384.134.43
25628,02911.98164.18

Racket web-server (stdlib)

ConnsReq/sAvg (ms)p99 (ms)
128,0410.2651.03
229,8580.3671.66
428,9540.3921.61
830,4890.5111.66
1630,8490.7331.89
3228,2071.392.92
6427,3312.545.69
12825,3054.889.91
25623,54310.1220.91

Flask gunicorn (1 worker)

ConnsReq/sAvg (ms)p99 (ms)
111,7740.0770.153
211,7720.1620.268
411,9170.3270.448
811,9560.6600.812
1611,9391.331.56
3211,9052.682.95
6411,8555.306.08
12811,8829.7910.76
25611,11620.8622.04

Top 5 by Concurrency Level

Connections 1st 2nd 3rd 4th 5th
1
1C (h2o)144,672 req/s
2Java (Vert.x)126,309 req/s
3Rust126,194 req/s
4Bun119,358 req/s
5Node.js109,249 req/s
2
1C (h2o)342,465 req/s
2Rust278,756 req/s
3Java (Vert.x)241,491 req/s
4Bun200,261 req/s
5Go173,898 req/s
4
1C (h2o)391,204 req/s
2Rust308,841 req/s
3Java (Vert.x)265,360 req/s
4Bun222,170 req/s
5Scheme209,966 req/s
8
1C (h2o)411,965 req/s
2Rust316,506 req/s
3Java (Vert.x)277,621 req/s
4Bun230,697 req/s
5Scheme215,618 req/s
16
1C (h2o)397,669 req/s
2Rust298,983 req/s
3Java (Vert.x)269,709 req/s
4Bun226,257 req/s
5Scheme222,365 req/s
32
1C (h2o)379,993 req/s
2Rust294,922 req/s
3Java (Vert.x)274,920 req/s
4Bun226,297 req/s
5Scheme221,382 req/s
64
1C (h2o)385,252 req/s
2Rust296,626 req/s
3Java (Vert.x)266,481 req/s
4Bun230,107 req/s
5Scheme212,670 req/s
128
1C (h2o)370,107 req/s
2Rust284,861 req/s
3Java (Vert.x)259,299 req/s
4Bun222,555 req/s
5Scheme211,276 req/s
256
1C (h2o)370,045 req/s
2Rust279,636 req/s
3Java (Vert.x)246,170 req/s
4Bun220,414 req/s
5Scheme204,960 req/s