the-benchmarker/web-frameworks

PHPweb-frameworks-benchmark.vercel.app

Which is the fastest web framework?

httpbenchmarkwebframeworkstandardmeasurementperformance
スター成長
スター
7.1k
フォーク
732
週間成長
+0
Issue
221
2k4k6k
2017年3月2020年5月2023年7月2026年9月
成果物Packagist
README

🚀 Web Frameworks Benchmark

A community-maintained, reproducible comparison of backend web frameworks

Explore the results · Add a framework · Report a problem · Join the discussion

CI License: MIT GitHub stars Contributors

From established full-stack platforms to small HTTP routers, this repository puts hundreds of implementations behind the same tiny API and runs them in isolated containers. Today, it makes a focused part of web-stack performance easier to measure, reproduce, and discuss. The longer-term goal is a comprehensive, evidence-based guide that helps businesses choose a backend framework—not merely a leaderboard that declares one universal winner.

[!IMPORTANT] These are minimal HTTP throughput and latency tests, not a substitute for profiling a production application. Framework features, maintainability, ecosystem, security, database access, and your real workload all matter.

🧪 Benchmark contract

Every implementation is expected to listen on port 3000 and provide the same responses:

Method Route Expected status Expected body
GET / 2xx Empty
GET /user/:id 2xx The id path parameter
POST /user 2xx Empty

Before an implementation is benchmarked, the shared RSpec contract verifies these routes. The default generated benchmark runs GET / for 15 seconds, disables keep-alive, applies latency correction, and records an oha JSON report. Concurrency and routes are configurable.

Collected fields include requests per second, total data received, run duration, and the p50, p75, p90, and p99 latency percentiles. Benchmark configuration is generated from three YAML layers:

config.yaml                  # provider and global settings
<language>/config.yaml       # language image, runtime, and engine settings
<language>/<framework>/config.yaml
                             # framework version, files, command, and overrides

📊 Results

The latest published results are available on the Web Frameworks Benchmark dashboard. Each result should be read in the context of its framework version, runtime or server variant, concurrency, benchmark revision, and hardware.

For a fair interpretation:

  • compare runs produced by the same benchmark revision and machine;
  • check the selected runtime/server variant, not only the framework name;
  • treat small differences as noise until repeated;
  • do not extrapolate this minimal API test to database-heavy or full application workloads.

🗺️ Roadmap

The project is evolving from a focused HTTP performance benchmark into a broader decision-support guide for organizations choosing a backend framework. The intended presentation is inspired by the clarity of quadrant-based market analysis, but the evaluation model will be designed specifically for backend frameworks and backed by transparent, reproducible evidence. This project is independent and is not affiliated with or endorsed by Gartner.

🏃 Run an implementation locally

📋 Requirements

  • Git
  • Docker
  • Ruby and Bundler (CI currently uses Ruby 4)
  • zrk on PATH
  • jq

Install the Ruby dependencies and generate the Dockerfiles and Makefiles:

git clone https://github.com/the-benchmarker/web-frameworks.git
cd web-frameworks
bundle install
bundle exec rake config

Then choose an implementation—for example, javascript/fastify—and use its generated Makefile:

make -f javascript/fastify/.Makefile build
make -f javascript/fastify/.Makefile test
make -f javascript/fastify/.Makefile warmup
mkdir -p javascript/fastify/.results/10
make -f javascript/fastify/.Makefile collect
make -f javascript/fastify/.Makefile unbuild

Results are written beneath <language>/<framework>/.results/. Generated targets also include clean for removing the framework container.

🎛️ Customize a run

The generator accepts comma-separated concurrency levels and routes. Set them while generating the Makefiles:

CONCURRENCIES=64,256,512 \
ROUTES='GET:/,GET:/user/42,POST:/user' \
bundle exec rake config

Then run the same collect target. Route entries use the METHOD:/path form. Create a matching .results/<concurrency> directory for every configured concurrency level before collecting results; the batch runner does this automatically for its predefined levels.

[!CAUTION] A full benchmark consumes substantial CPU, memory, time, network bandwidth, and container storage. Start with one implementation and keep the load generator separate from services you care about.

🤝 Add or update a framework

Contributions are welcome: new frameworks and variants, dependency updates, correctness fixes, documentation, and benchmarking improvements all help.

A typical implementation lives in <language>/<framework>/ and contains:

  • a config.yaml describing its version, website, files, startup command, and engine variants;
  • the smallest application that fulfills the shared route contract;
  • dependency manifests or lockfiles required for a reproducible container build.

To validate a contribution:

bundle exec rake config
make -f <language>/<framework>/.Makefile build
make -f <language>/<framework>/.Makefile test
make -f <language>/<framework>/.Makefile unbuild

Read CONTRIBUTING.md before opening a pull request, and follow the Code of Conduct. If you maintain the framework you are adding, mention that in the PR—it helps reviewers evaluate idiomatic configuration and tuning.

🗂️ Repository map

Path Purpose
<language>/<framework>/ Framework implementation and configuration
.spec/ Shared HTTP correctness contract
.tasks/ Configuration, CI, collection, cloud, and database tasks
.github/workflows/ci.yml Changed-implementation CI matrix
config.yaml Global providers and execution templates
data.json / data.min.json Published benchmark dataset
run.sh Batch runner for all, one language, or one framework

💖 Sponsors

Sponsors help cover benchmark infrastructure, repeated test runs, result hosting, and the maintenance involved in keeping hundreds of implementations current.

Neon

To sponsor hardware, cloud credits, hosting, or ongoing development, start a sponsorship discussion. Sponsor names and links can be added here with the sponsor's approval; support never affects benchmark rankings or inclusion decisions.

💬 Community and support

  • Use GitHub Discussions for methodology, ideas, and general questions.
  • Use GitHub Issues for reproducible bugs and framework failures.
  • Use pull requests for implementation and documentation improvements.

Please include the framework path, runtime variant, host architecture, Docker version, commands used, and relevant logs when reporting a benchmark problem.

📄 License

This project is available under the MIT License.

関連リポジトリ
hoppscotch/hoppscotch

Open-Source API Development Ecosystem • https://hoppscotch.io • Offline, On-Prem & Cloud • Web, Desktop & CLI • Open-Source Alternative to Postman, Insomnia

TypeScriptnpmlibraryMIT Licenseapiapi-client
hoppscotch.io
80.3k6.1k
caddyserver/caddy

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

GoGo ModulesApache License 2.0goweb-server
caddyserver.com
75.6k4.9k
ngosang/trackerslist

Updated list of public BitTorrent trackers

awesomeGNU General Public License v2.0trackersbittorrent-trackers
ngosang.github.io/trackerslist/
55.1k6.6k
psf/requests

A simple, yet elegant, HTTP library.

PythonPyPIlibraryApache License 2.0pythonhttp
requests.readthedocs.io/en/latest/
54.3k10.1k
MHSanaei/3x-ui

Supporting multi-protocol multi-user(Vmess, Vless, Trojan, ShadowSocks, Wireguard, Hysteria, Tunnel, Mixed, HTTP, Tun, MTProto، AmneziaWG)

GoGo ModulesGNU General Public License v3.0trojanvless
docs.sanaei.dev
46.1k11.4k
mitmproxy/mitmproxy

An interactive TLS-capable intercepting HTTP proxy for penetration testers and software developers.

PythonPyPIcliMIT Licensepythonsecurity
mitmproxy.org
45k4.7k
curl/curl

A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features

CcliOtherhttphttps
curl.se
42.8k7.3k
aria2/aria2

aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.

C++cliGNU General Public License v2.0cpp11http
aria2.github.io
42k3.9k
apache/dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.

JavaMavenlibraryApache License 2.0dubbodistributed-systems
dubbo.apache.org
41.6k26.4k
httpie/cli

🥧 HTTPie CLI — modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more.

PythonPyPIcliBSD 3-Clause "New" or "Revised" Licensehttpcli
httpie.io
38.5k4k
ehang-io/nps

一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。a lightweight, high-performance, powerful intranet penetration proxy server, with a powerful web management terminal.

GoGo ModulesGNU General Public License v3.0sockstcp
ehang.io/nps/documents
34.2k6.1k
nginx/nginx

The official NGINX Open Source repository.

CBSD 2-Clause "Simplified" Licensecontent-cacheload-balancer
nginx.org
31.6k8.3k