Performance comparison for django, fastapi, express, fastify vs vibe-d:
To measure performance using loadtest. So install it:
npm i -g loadtest
docker-compose up
The following ports are configured by default:
- Django: 8000
- Fastapi: 8008
- Express: 9000
- Vibe-d: 7000
- Fastify: 9001
Tests was running on docker-machine with 4 virtual cores and 1256 MB memory available
loadtest -n 20000 -c 32 http://127.0.0.1:8000
loadtest -n 20000 -c 32 -k http://127.0.0.1:8000
Instead of 8000
would be either port of testing framework
Metric | Requests per sec | CPU usage (motionless) | CPU usage (max) | Memory usage | pids | errors |
---|---|---|---|---|---|---|
Django | 1514 requests | 0.05% | 390% | 220Mb | 9 | 0 |
Fastapi (sync) | 1216 requests | 2% | 380% | 180Mb | 9-106 | 1 |
Fastapi (async) | 1622 requests | 2% | 353% | 175Mb | 9 | 1 |
Django (meinheld) | 1629 requests | 0.15% | 335% | 335Mb | 9 | 0 |
Express (w c) | 1586 requests | 0% | 260% | 105Mb | 35 | 0 ** |
Fastify * | 1750 requests | 0% | 105% | 75 Mb | 23 | 0 |
Fastify (w c) | ||||||
vibe-d (dmd) **** | 2342 requests | 0% | 105% | 33Mb | 6 | 0 |
Metric | Requests per sec | CPU usage (motionless) | CPU usage (max) | Memory usage | pids | errors |
---|---|---|---|---|---|---|
Django | 1514 requests | 0.05% | 390% | 220Mb | 9 | 0 |
Fastapi (sync) | 2114 requests | 2% | 405% | 175Mb | 61 | 0 |
Fastapi(async) | 3569 requests | 2% | 380% | 180Mb | 9 | 0 |
Django (meinheld) | 2884 requests | 0.15% | 400% | 335Mb | 9 | 0 |
Express (w c)*** | 4500 requests | 0% | 195% | 60Mb | 9 | 0 |
Fastify (w/o c) | 3500 requests | 0% | 105% | 75 Mb | 35 | 0 |
Fastify (w c) | 4500 requests | 0% | 212% | 477 Mb | 47 | 0 |
vibe-d (dmd) **** | 4150 requests | 0% | 105% | 33Mb | 6 | 0 |
Footnotes:
- w/o clusterisation (manual clusterisation did not have any effect (expect the hugest memory allocation) because of (I suppose) clusterisation integrated in framework)
- w/o clusterisation was at less one error
- Results with pm2 is not included, because its showed worse results on loadtest than on manual clusterisation tuning (1500 and 3800 r/sec suitably and 55 processes)
- vibe-d was launched on only one core (w/o clusterisation)
# start wrk service:
docker exec -it wrk_test /bin/sh
# get target ip inside internal network (get it via `docker network ls` command):
docker network inspect pentest_default
# start test:
wrk -t4 -c100 -d3s <url> # for example http://172.21.0.3:3000
Metric | Requests per sec | CPU usage (max) | Memory usage |
---|---|---|---|
Django | 2200 requests | 390% | 220Mb |
Fastapi (sync) | 3500 requests | 380% | 176 Mb |
Fastapi(async) | 7000 requests | 380% | 100Mb |
Django (m) | 4100 requests | 390% | 235Mb |
Express (w c)* | 35000 requests | 425% | 120Mb |
Fastify (w/o c) | 10500 requests | 425% | 75 Mb |
Fastify (w c) | 30000 requests | 425% | 420 Mb |
vibe-d (one core) | 16000 requests | 120% | 6 Mb |
vibe-d (4 core) ** | 31500 requests | 312% | 8Mb |
vibe-d (4 core) *** | 36500 requests | 338% | 34Mb |
- Results with pm2 is not included, because its showed worse results on loadtest than on manual clusterisation tuning (9000 r/sec)
- via
setupWorkerThreads && runWorkerTaskDist
- via
fork
fromcore.sys.posix.unistd
FX-8350 && 8Gb memory is available (x64)
- Apply
npm i
inside Express and Fastify directories - Apply
pipenv shell
inside Django and Fastapi directories - I need ldc2 compliler for vibe-d compilation
Init scripts:
- Express :3000:
node index.js
- Fastify :3000:
npm run begin
- Django :8000:
waitress-serve --listen=*:8000 --threads=8 project.wsgi:application
from project catalog - Fastapi :8000:
uvicorn-run.bat
- VibeD :8088:
run.bat
- asp net : depends on your iis settings
Metric | Django (waitress) | Fastapi (just uvicorn) | Express | ASP NET | Fastify | IIS | vibeD |
---|---|---|---|---|---|---|---|
Request per sec | 1077 requests | 568 (642) requests | 2300 requests | 2205 requests | 2300 requests | 2416 requests | 2426 requests |
longest request | 58 ms | 113ms | 43 ms | 42 ms | 52 ms | 42 ms | 41 ms |
Metric | Django (waitress) | Fastapi (just uvicorn) | Express | ASP NET ** | Fastify * | IIS | vibeD |
---|---|---|---|---|---|---|---|
Request per sec | -//- | -//- | 4132 requests | 4572 requests | 5350 requests | 5000 requests | 5300 requests |
longest request | 45 ms | 53 ms | 45 ms | 41 ms | 41 ms |
- With clusterisations and w/o is equals results (Node.js clusterisation is handling via clusters)
- ASP NET consumes about 150 MB of RAM in dev mode. I didn't check it after deployment, but it's unlikely anymore
- from the-benchmarker
- from techempower
- look up also apache banchmarks tests here