The official performance, resilience, and load-testing suite for the Rullst Framework.
π View the Interactive Web Dashboard π View the Full Benchmark Results Table
Rullst is built to give you the extreme productivity of full-stack frameworks combined with the memory safety and blistering high throughput of Rust.
This repository contains a comprehensive 4-tier benchmark suite designed to rigorously evaluate the performance, resilience, and resource efficiency of 25 modern web frameworks across multiple languages.
We don't just guess; we measure. π
To simulate different real-world scenarios, our testing approach is divided into four robust tiers:
- Goal: Establish a baseline for raw Requests Per Second (RPS) and latency.
- Load: 125 concurrent connections for 10 seconds.
- Endpoints:
/text,/json,/db-single,/html
- Goal: Evaluate behavior under sudden traffic spikes and measure P99 latency.
- Load: 300 concurrent connections for 30 seconds.
- Endpoints:
/json
- Goal: Identify CPU and RAM utilization of "greedy" vs. "efficient" architectures.
- Method: Measure Docker stats during 0 traffic (Idle) vs. 200 concurrent connections (Peak).
- Goal: Ensure frameworks don't crash or leak memory under prolonged stress.
- Load: 500 concurrent connections for a sustained 2 minutes.
- Endpoints:
/json
Our official ranking is determined by the Efficiency Score, which measures how many requests a framework can handle per megabyte of memory it consumes.
- Formula:
Efficiency = JSON RPS (Tier 1) / Peak RAM in MB (Tier 3) - Example: A framework handling 100,000 RPS with 20MB RAM scores
5,000. A framework handling 100,000 RPS with 200MB RAM scores500. - The Disqualification Penalty: Any framework that drops connections, crashes, or returns
timeouterrors during the Tier 4 Stress Test is automatically disqualified and receives 0 Points. Speed is irrelevant if the server collapses under pressure!
To run these benchmarks locally without skewing the results due to resource starvation (especially during the 500-connection Tier 4 tests), we recommend the following minimum specifications:
- CPU: 4 Cores / 8 Threads (8+ Cores recommended)
- RAM: 8GB Minimum (16GB+ recommended)
- OS: Linux, macOS, or Windows (WSL2)
- Docker Engine: Ensure Docker is allocated at least 4 CPUs and 8GB of RAM.
All benchmark results listed in this repository were run on the following environment to ensure consistency:
- CPU:
AMD Ryzen 7 5700U (8 Cores / 16 Threads) - RAM:
8GB - OS:
Windows 11 (Docker with WSL2)
All frameworks connect to a dedicated PostgreSQL 15 container.
- The database is initialized via the
db-initscripts which pre-populate a table calledworldwith thousands of random rows. - Frameworks must fetch the
Worldrecord withID = 1for the/db-singleendpoint. Connection pooling is strictly recommended.
We have updated our test suite to target the latest stable versions of all 23 frameworks:
| # | Framework | Language / Runtime | Targeted Version |
|---|---|---|---|
| 1 | Express | JS/TS (Node) | 5.1.x |
| 2 | Fastify | JS/TS (Node) | 5.8.x |
| 3 | NestJS | JS/TS (Node) | 11.1.x |
| 4 | Hono | JS/TS | 4.12.x |
| 5 | Go-Fiber | Go | 3.0.x |
| 6 | Go-Gin | Go | 1.11.x |
| 7 | Django | Python | 6.0.x |
| 8 | FastAPI | Python | 0.138.x |
| 9 | Laravel | PHP | 13.x |
| 10 | Symfony | PHP | 7.4.x |
| 11 | Ruby on Rails | Ruby | 7.2.x |
| 12 | Phoenix | Elixir | 1.8.x |
| 13 | Quarkus | Java | 3.36.x |
| 14 | Spring Boot | Java | 4.0.x |
| 15 | ASP.NET Core | C# (.NET) | 10.0.x |
| 16 | Actix Web | Rust | 4.13.x |
| 17 | Axum | Rust | 0.8.x |
| 18 | Dioxus | Rust | 0.7.x |
| 19 | Leptos | Rust | 0.7.x |
| 20 | Poem | Rust | 3.x |
| 21 | Salvo | Rust | 0.93.x |
| 22 | Next.js | JS/TS (Node) | 15.x |
| 23 | Rullst | Rust | 4.0.1 (Ours) |
| π Rank | Framework | Language | Efficiency (RPS/MB) | JSON RPS | DB Single RPS | Avg Latency | Peak RAM | Status |
|---|---|---|---|---|---|---|---|---|
| π₯ 1st | Actix-Web | Rust | 6.778 | 128.654,31 | 12.366,9 | 2.34ms | 18.98MiB | β Passed |
| π₯ 2nd | Axum | Rust | 4.580 | 100.620,33 | 18.033,16 | 2.61ms | 21.97MiB | β Passed |
| π₯ 3rd | Poem | Rust | 4.346 | 98.795,48 | 12.405,22 | 2.68ms | 22.73MiB | β Passed |
| 4 | Rullst π | Rust | 4.344 | 90.485,67 | 16.186,7 | 3.14ms | 20.83MiB | β Passed |
| 5 | Salvo | Rust | 4.141 | 92.218,37 | 7.465,66 | 2.96ms | 22.27MiB | β Passed |
| 6 | Go-Fiber | Go | 4.032 | 99.803,89 | 16.026,64 | 2.68ms | 24.75MiB | β Passed |
| 7 | Dioxus | Rust | 3.448 | 87.638,05 | 9.431,99 | 2.79ms | 25.42MiB | β Passed |
| 8 | Leptos | Rust | 3.024 | 77.135,01 | 8.009 | 2.94ms | 25.51MiB | β Passed |
| 9 | Go-Gin | Go | 2.898 | 70.219,4 | 13.627,19 | 4.14ms | 24.23MiB | β Passed |
| 10 | ASP.NET Core | C# | 718 | 75.723,47 | 11.181,52 | 3.63ms | 105.5MiB | β Passed |
| 11 | Phoenix | Elixir | 73 | 16.243,87 | 2.400,09 | 15.82ms | 223.4MiB | β Passed |
| 12 | Quarkus | Java | 62 | 27.789,39 | 2.867,81 | 4.49ms | 449.6MiB | β Passed |
| 13 | FastAPI | Python | 27 | 7.568,21 | 2,49 | 48.12ms | 282MiB | β Passed |
| 14 | Spring Boot | Java | 15 | 7.648,31 | 260,65 | 11.98ms | 508.4MiB | β Passed |
| 15 | Ruby on Rails | Ruby | 3 | 298,56 | 144,6 | 0.99s | 100.3MiB | β Passed |
| 16 | Django | Python | 0 | 4.733,45 | 3,82 | 1.26m | 139.3MiB | β Failed |
| 17 | Express | Node.js | 0 | 3.804,97 | 1.051,43 | 86.05ms | 101.1MiB | β Failed |
| 18 | Fastify | Node.js | 0 | 11.544,78 | 1.364,58 | 26.11ms | 92.84MiB | β Failed |
| 19 | Hono | TypeScript | 0 | 7.959,06 | 898,71 | 42.63ms | 88.43MiB | β Failed |
| 20 | Laravel | PHP | 0 | 97.957,06 | 82.542,81 | 3.37ms | 0B | β Failed |
| 21 | NestJS | Node.js | 0 | 2.855,24 | 857,72 | 109.53ms | 120.2MiB | β Failed |
| 22 | Next.js | TypeScript | 0 | 510,52 | 358,1 | 677.85ms | 129.8MiB | β Failed |
| 23 | Symfony | PHP | 0 | 102.008,3 | 102.971,02 | 3.25ms | 70.17MiB | β Failed |
Before launching the rockets, ensure your environment is ready:
- π³ Docker & Docker Compose (Crucial for containerized, isolated environments)
- π¦ Rust (v1.85+) (Required if running internal Rust micro-benchmarks)
- π Python (v3.x) (Used to parse results and build tables)
To ensure pinpoint accuracy, our bash scripts orchestrate everything automatically (building, starting, benchmarking, and tearing down sequentially).
π₯οΈ Execution (Linux / macOS / WSL / Git Bash):
chmod +x run_benchmarks.sh
./run_benchmarks.sh(Note: You can also explore run_batch.sh to test specific batches of frameworks).
π Output:
The raw results are saved under results/ and automatically compiled into a neat comparative markdown table (e.g., benchmarks_results.md).
Want to include a framework in this list or improve a script? Feel free to leave a comment in the Discussions or open an Issue in this repository! For detailed instructions on how to add your own framework, please check our CONTRIBUTING.md.
This project is licensed under the MIT License.
β The Rullst Team