Web 后端框架性能测试
对各种常见的 Web 后端框架进行性能测试,比较它们的吞吐量、内存占用
起因
近期我打算开坑一个后端项目,而这个后端项目可能会部署在性能不算充裕的服务器上(2C2G 或者 4G2C),所以我打算在开工之前进行技术选型,在一些常见的后端框架中选出最优的框架。
性能测试
说明
这些性能测试的代码我会公开在 GitHub 上,若某些测试中我的代码实现不是最优的,则欢迎指出并联系我重测。
为了避免因 JIT 预热导致的吞吐量下降,每个测试我将会运行 4 次,取后 3 次的平均值(视情况进行,若有特殊情况会提及)。
测试若未提及,则使用 Release 或类似的模式构建,JVM 类测试不设置内存上限与下限。
测试若未提及,则默认使用 wrk 进行测试,使用内置的 time 工具对后端进程测量数据,参数如下:
/usr/bin/time -l ...
wrk -t2 -c100 -d5s ...
以下为一些测量值的缩写:
Qps= 每秒钟能够响应的请求数量
Mmax= 测量过程中内存占用的峰值
Iops= 每秒钟能收发数据的大小
Env= 运行该程序使用的运行时或语言编译器版本
以下为一些名词缩写:
MAPI=Minimal API
NAOT=Native AOT
I. “Hello, World”
测试机:
MacBook Pro,散热风扇满速运行,插着电源线
操作系统:macOS 14.5
CPU:Intel(R) Core(TM) i7-6920HQ CPU @ 2.90GHz
内存:16 GB 2133 MHz LPDDR3
本项测量后端返回 Hello, World 这串字符串的性能信息,源代码位于 此处。
| 框架及语言 | Env |
Qps |
Iops |
Mmax |
Qps / Mmax |
|---|---|---|---|---|---|
| Express + JS | Node 24.4.0 | 21491.82 | 3.22 MB | 93.24 MB | 230.50 |
| Express + JS | Deno 2.5.4 | 3763.79 | 0.56 MB | 130.12 MB | 28.92 |
| Express + JS | Bun 1.3.1 | 35034.11 | 3.67 MB | 135.38 MB | 258.78 |
| Elysia + TS | Bun 1.3.1 | 95181.65 | 12.71 MB | 48.87 MB | 1947.65 |
| Fiber + Go | Go 1.24.1 | 85543.97 | 10.52 MB | 7.47 MB | 11451.67 |
| Gin + Go | Go 1.24.1 | 67747.39 | 8.33 MB | 16.47 MB | 4113.38 |
| net/http + Go | Go 1.24.1 | 73630.97 | 8.01 MB | 14.19 MB | 5188.93 |
| Axum + Rust | Rust Stable | 89790.75 | 11.13 MB | 6.91 MB | 12994.32 |
| Actix + Rust | Rust Stable | 83287.62 | 10.25 MB | 5.51 MB | 15115.72 |
| ASP.NET Core + C# | .NET 9.0 | 52430.08 | 8.20 MB | 100.52 MB | 521.59 |
| ASP.NET Core (MAPI) + C# | .NET 9.0 | 62726.49 | 9.81 MB | 92.65 MB | 677.03 |
| ASP.NET Core (MAPI NAOT) + C# | .NET 9.0 | 60666.36 | 9.49 MB | 114.71 MB | 531.36 |
| Spring Boot + Java | Azul Zulu 21 | 36078.82 | 4.34 MB | 286.85 MB | 125.78 |
| Spring Boot + Java | Azul Zulu 17 | 35859.39 | 4.31 MB | 246.51 MB | 145.47 |
| Spring Boot + Kotlin | Azul Zulu 21 | 39565.97 | 4.76 MB | 316.44 MB | 125.03 |
| Spring Boot + Kotlin | Azul Zulu 17 | 42077.66 | 5.06 MB | 327.96 MB | 128.30 |
| Solon + Java | Azul Zulu 21 | 47973.09 | 11.71 MB | 304.21 MB | 157.70 |
| Solon + Java | Azul Zulu 17 | 52793.01 | 12.89 MB | 318.34 MB | 165.84 |
| Javalin + Java | Azul Zulu 21 | 50898.46 | 5.53 MB | 611.75 MB | 83.20 |
| Javalin + Java | Azul Zulu 17 | 49863.52 | 5.42 MB | 551.24 MB | 90.46 |
| Django (Gunicorn) + Python | Python 3.10.16 | 758.76 | 0.22 MB | 34.54 MB | 21.97 |
| Django (Gunicorn) + Python | Python 3.14.0a5 | 810.39 | 0.23 MB | 34.59 MB | 23.43 |
II. Database
Coming Soon…
FAQ
Q:为什么不直接看 TechEmpower?
A:TechEmpower 注重于性能,我翻来翻去实在找不到对内存占用这块的测试,
我不希望使用以空间换时间的框架/库,这会增大服务器的成本,所以也才会
有 Qps / Mmax 一栏,找出性能和资源占用都最优的框架。
Q:为什么不测试 XX 框架?
A:不同的语言、运行时可能有着不同的生态,测量仅仅是性能好,但生态不佳的
语言、运行时是没有意义的。
在后端开发上不只会和 HTTP 打交道,还会与数据库、缓存、队列等打交道,
测试一个性能优秀但生态不佳的框架是无意义的。
当然,后续会陆续补充更多框架的性能测试。
上次修改於 2025-10-27