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