Reference
Runtimes and frameworks
The Stack an App Server runs: its language, runtime, and framework, and how each one trades speed for safety.
Each App Server runs one Stack. The language sets how fast the team writes code and what it costs to hire. The runtime sets how the server handles many requests at once. The framework adds speed of work, and costs CPU and memory on each request.
Languages#
| Language | Velocity | Salary | Hire time | Build |
|---|---|---|---|---|
| PHP | ×1.2 | ×0.85 | ×1 | 0.5 min |
| Ruby | ×1.1 | ×1.1 | ×1.5 | 1 min |
| Node.js | ×1.15 | ×1 | ×1 | 3 min |
| Python | ×1.15 | ×1.05 | ×1 | 1 min |
| Go | ×0.95 | ×1.15 | ×1.4 | 1.5 min |
| Java | ×0.9 | ×1.05 | ×1.1 | 6 min |
| C# | ×1 | ×1 | ×1.1 | 4 min |
| Elixir | ×1 | ×1.2 | ×2.5 | 2 min |
| Rust | ×0.6 | ×1.25 | ×2 | 12 min |
| Zig | ×0.7 | ×1.25 | ×3 | 6 min |
| Haskell | ×1.15 | ×1.4 | ×2.5 | 8 min |
Runtimes#
| Runtime | Concurrency | Speed | Memory | GC pause |
|---|---|---|---|---|
| Apache mod_php | One process per request | ×0.15 | 60 MB | — |
| PHP-FPM | One process per request | ×0.15 | 40 MB | — |
| Puma | A thread pool | ×0.25 | 180 MB | — |
| Node.js | One event loop | ×0.7 | 80 MB | — |
| Node.js cluster | One event loop | ×0.7 | 80 MB | — |
| Gunicorn | One process per request | ×0.2 | 120 MB | — |
| Go net/http | Green threads | ×1 | 30 MB | 1 ms |
| Tomcat | A thread pool | ×1.1 | 500 MB | 30 ms |
| Kestrel | Async tasks on a thread pool | ×1.1 | 150 MB | 15 ms |
| BEAM | Green threads | ×0.45 | 100 MB | — |
| Tokio | Async tasks on a thread pool | ×1.4 | 10 MB | — |
| Zig threaded server | A thread pool | ×1.3 | 24 MB | — |
| Haskell (GHC + Warp) | Green threads | ×0.85 | 80 MB | 12 ms |
Frameworks#
| Framework | Language | Overhead | Velocity | ORM |
|---|---|---|---|---|
| No framework | Any | 1 ms | ×0.8 | No |
| Laravel | PHP | 1.8 ms | ×1.45 | Yes |
| Rails | Ruby | 1.5 ms | ×1.5 | Yes |
| Express | Node.js | 1.1 ms | ×1.2 | No |
| Django | Python | 1.4 ms | ×1.4 | Yes |
| Symfony | PHP | 1.5 ms | ×1.25 | No |
| Sinatra | Ruby | 1.1 ms | ×1.1 | No |
| Flask | Python | 1.1 ms | ×1.1 | No |
| Gin | Go | 1.05 ms | ×1.1 | No |
| Spring Boot | Java | 1.3 ms | ×1.1 | No |
| ASP.NET Core | C# | 1.05 ms | ×1.15 | No |
| Phoenix | Elixir | 1.1 ms | ×1.3 | No |
| Axum | Rust | 1 ms | ×1.15 | No |
| Actix Web | Rust | 0.95 ms | ×1.1 | No |