Running

docker-compose build

docker-compose up {dotnet|fastify}

Important to use docker-compose and not docker compose. In my case docker compose was ignoring cpu limits messing up the benchmarks Your mileage may vary

Checking stats

You can check in real time how much memory and cpu is consumed by the containers

docker stats $( docker ps --format '{{ .Names }}' )

Benchmarking

autocannon -c 100 -d 30 -p 10 localhost:3000

Results

Dotnet

┌─────────┬───────┬───────┬───────┬───────┬──────────┬──────────┬────────┐
│ Stat    │ 2.5%  │ 50%   │ 97.5% │ 99%   │ Avg      │ Stdev    │ Max    │
├─────────┼───────┼───────┼───────┼───────┼──────────┼──────────┼────────┤
│ Latency │ 10 ms │ 21 ms │ 85 ms │ 91 ms │ 37.89 ms │ 26.77 ms │ 115 ms │
└─────────┴───────┴───────┴───────┴───────┴──────────┴──────────┴────────┘
┌───────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ Stat      │ 1%      │ 2.5%    │ 50%     │ 97.5%   │ Avg     │ Stdev   │ Min     │
├───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Req/Sec   │ 22927   │ 22927   │ 26191   │ 29023   │ 26065.6 │ 1534.87 │ 22927   │
├───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Bytes/Sec │ 4.04 MB │ 4.04 MB │ 4.61 MB │ 5.11 MB │ 4.59 MB │ 270 kB  │ 4.04 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

783k requests in 30.06s, 138 MB read

Dotnet Old

By old I mean with controllers

┌─────────┬───────┬───────┬────────┬────────┬──────────┬──────────┬────────┐
│ Stat    │ 2.5%  │ 50%   │ 97.5%  │ 99%    │ Avg      │ Stdev    │ Max    │
├─────────┼───────┼───────┼────────┼────────┼──────────┼──────────┼────────┤
│ Latency │ 19 ms │ 81 ms │ 106 ms │ 110 ms │ 69.26 ms │ 27.59 ms │ 149 ms │
└─────────┴───────┴───────┴────────┴────────┴──────────┴──────────┴────────┘
┌───────────┬─────────┬─────────┬─────────┬─────────┬──────────┬────────┬─────────┐
│ Stat      │ 1%      │ 2.5%    │ 50%     │ 97.5%   │ Avg      │ Stdev  │ Min     │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼────────┼─────────┤
│ Req/Sec   │ 12879   │ 12879   │ 14279   │ 16175   │ 14319.47 │ 789.44 │ 12874   │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼────────┼─────────┤
│ Bytes/Sec │ 2.27 MB │ 2.27 MB │ 2.51 MB │ 2.85 MB │ 2.52 MB  │ 139 kB │ 2.27 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴──────────┴────────┴─────────┘

431k requests in 30.06s, 75.6 MB read

Fastify

Running 30s test @ http://localhost:3002
┌─────────┬───────┬────────┬────────┬────────┬───────────┬──────────┬─────────┐
│ Stat    │ 2.5%  │ 50%    │ 97.5%  │ 99%    │ Avg       │ Stdev    │ Max     │
├─────────┼───────┼────────┼────────┼────────┼───────────┼──────────┼─────────┤
│ Latency │ 92 ms │ 112 ms │ 185 ms │ 210 ms │ 122.72 ms │ 37.97 ms │ 1831 ms │
└─────────┴───────┴────────┴────────┴────────┴───────────┴──────────┴─────────┘
┌───────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ Stat      │ 1%      │ 2.5%    │ 50%     │ 97.5%   │ Avg     │ Stdev   │ Min     │
├───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Req/Sec   │ 7155    │ 7155    │ 8151    │ 9127    │ 8099.8  │ 475.85  │ 7155    │
├───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Bytes/Sec │ 1.35 MB │ 1.35 MB │ 1.53 MB │ 1.72 MB │ 1.52 MB │ 89.5 kB │ 1.35 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

244k requests in 30.04s, 45.7 MB read

Express

┌─────────┬────────┬────────┬────────┬────────┬───────────┬──────────┬────────┐
│ Stat    │ 2.5%   │ 50%    │ 97.5%  │ 99%    │ Avg       │ Stdev    │ Max    │
├─────────┼────────┼────────┼────────┼────────┼───────────┼──────────┼────────┤
│ Latency │ 414 ms │ 516 ms │ 599 ms │ 630 ms │ 521.16 ms │ 57.49 ms │ 680 ms │
└─────────┴────────┴────────┴────────┴────────┴───────────┴──────────┴────────┘
┌───────────┬────────┬────────┬────────┬────────┬────────┬─────────┬────────┐
│ Stat      │ 1%     │ 2.5%   │ 50%    │ 97.5%  │ Avg    │ Stdev   │ Min    │
├───────────┼────────┼────────┼────────┼────────┼────────┼─────────┼────────┤
│ Req/Sec   │ 1739   │ 1739   │ 1872   │ 2115   │ 1899.1 │ 98.69   │ 1739   │
├───────────┼────────┼────────┼────────┼────────┼────────┼─────────┼────────┤
│ Bytes/Sec │ 438 kB │ 438 kB │ 472 kB │ 533 kB │ 479 kB │ 24.9 kB │ 438 kB │
└───────────┴────────┴────────┴────────┴────────┴────────┴─────────┴────────┘

58k requests in 30.04s, 14.4 MB read

Gin

┌─────────┬──────┬───────┬────────┬────────┬───────────┬───────────┬─────────┐
│ Stat    │ 2.5% │ 50%   │ 97.5%  │ 99%    │ Avg       │ Stdev     │ Max     │
├─────────┼──────┼───────┼────────┼────────┼───────────┼───────────┼─────────┤
│ Latency │ 1 ms │ 91 ms │ 804 ms │ 994 ms │ 179.36 ms │ 232.31 ms │ 2510 ms │
└─────────┴──────┴───────┴────────┴────────┴───────────┴───────────┴─────────┘
┌───────────┬────────┬────────┬────────┬────────┬─────────┬─────────┬────────┐
│ Stat      │ 1%     │ 2.5%   │ 50%    │ 97.5%  │ Avg     │ Stdev   │ Min    │
├───────────┼────────┼────────┼────────┼────────┼─────────┼─────────┼────────┤
│ Req/Sec   │ 4999   │ 4999   │ 5415   │ 6247   │ 5496.67 │ 309.64  │ 4999   │
├───────────┼────────┼────────┼────────┼────────┼─────────┼─────────┼────────┤
│ Bytes/Sec │ 700 kB │ 700 kB │ 758 kB │ 874 kB │ 769 kB  │ 43.4 kB │ 700 kB │
└───────────┴────────┴────────┴────────┴────────┴─────────┴─────────┴────────┘

166k requests in 30.06s, 23.1 MB read

Rust rocket

┌─────────┬────────┬────────┬────────┬────────┬───────────┬──────────┬────────┐
│ Stat    │ 2.5%   │ 50%    │ 97.5%  │ 99%    │ Avg       │ Stdev    │ Max    │
├─────────┼────────┼────────┼────────┼────────┼───────────┼──────────┼────────┤
│ Latency │ 102 ms │ 128 ms │ 199 ms │ 205 ms │ 140.54 ms │ 29.88 ms │ 260 ms │
└─────────┴────────┴────────┴────────┴────────┴───────────┴──────────┴────────┘
┌───────────┬────────┬────────┬─────────┬─────────┬─────────┬────────┬─────────┐
│ Stat      │ 1%     │ 2.5%   │ 50%     │ 97.5%   │ Avg     │ Stdev  │ Min     │
├───────────┼────────┼────────┼─────────┼─────────┼─────────┼────────┼─────────┤
│ Req/Sec   │ 6155   │ 6155   │ 7059    │ 7975    │ 7079.87 │ 414.15 │ 6152    │
├───────────┼────────┼────────┼─────────┼─────────┼─────────┼────────┼─────────┤
│ Bytes/Sec │ 1.5 MB │ 1.5 MB │ 1.72 MB │ 1.94 MB │ 1.72 MB │ 101 kB │ 1.49 MB │
└───────────┴────────┴────────┴─────────┴─────────┴─────────┴────────┴─────────┘

213k requests in 30.03s, 51.6 MB read

Go http

┌─────────┬──────┬───────┬────────┬────────┬───────────┬───────────┬─────────┐
│ Stat    │ 2.5% │ 50%   │ 97.5%  │ 99%    │ Avg       │ Stdev     │ Max     │
├─────────┼──────┼───────┼────────┼────────┼───────────┼───────────┼─────────┤
│ Latency │ 1 ms │ 89 ms │ 610 ms │ 797 ms │ 152.06 ms │ 182.89 ms │ 1917 ms │
└─────────┴──────┴───────┴────────┴────────┴───────────┴───────────┴─────────┘
┌───────────┬────────┬────────┬────────┬────────┬────────┬─────────┬────────┐
│ Stat      │ 1%     │ 2.5%   │ 50%    │ 97.5%  │ Avg    │ Stdev   │ Min    │
├───────────┼────────┼────────┼────────┼────────┼────────┼─────────┼────────┤
│ Req/Sec   │ 5927   │ 5927   │ 6463   │ 7415   │ 6511.2 │ 350.15  │ 5926   │
├───────────┼────────┼────────┼────────┼────────┼────────┼─────────┼────────┤
│ Bytes/Sec │ 794 kB │ 794 kB │ 866 kB │ 993 kB │ 872 kB │ 46.9 kB │ 794 kB │
└───────────┴────────┴────────┴────────┴────────┴────────┴─────────┴────────┘

196k requests in 30.04s, 26.2 MB read

Fiber

┌─────────┬──────┬───────┬───────┬───────┬──────────┬──────────┬────────┐
│ Stat    │ 2.5% │ 50%   │ 97.5% │ 99%   │ Avg      │ Stdev    │ Max    │
├─────────┼──────┼───────┼───────┼───────┼──────────┼──────────┼────────┤
│ Latency │ 5 ms │ 13 ms │ 73 ms │ 79 ms │ 24.85 ms │ 21.97 ms │ 130 ms │
└─────────┴──────┴───────┴───────┴───────┴──────────┴──────────┴────────┘
┌───────────┬─────────┬─────────┬─────────┬───────┬──────────┬─────────┬─────────┐
│ Stat      │ 1%      │ 2.5%    │ 50%     │ 97.5% │ Avg      │ Stdev   │ Min     │
├───────────┼─────────┼─────────┼─────────┼───────┼──────────┼─────────┼─────────┤
│ Req/Sec   │ 34047   │ 34047   │ 39903   │ 44831 │ 39413.34 │ 2456.15 │ 34022   │
├───────────┼─────────┼─────────┼─────────┼───────┼──────────┼─────────┼─────────┤
│ Bytes/Sec │ 4.56 MB │ 4.56 MB │ 5.35 MB │ 6 MB  │ 5.28 MB  │ 329 kB  │ 4.56 MB │
└───────────┴─────────┴─────────┴─────────┴───────┴──────────┴─────────┴─────────┘

1183k requests in 30.05s, 158 MB read