性能基准

这份基准用于帮助你选择 Vext HTTP Adapter。它固定同一个 Vext 应用,在相同的轻量 Normal 负载下比较五个受支持的 Adapter。它适合作为 Adapter 选型输入,不替代你的应用在真实中间件、鉴权、日志、数据库和部署环境下的压测。

先看结论

  • 这是 Adapter 对比,不是跨框架排行榜。 每一行均使用相同的 Vext routes、Normal bootstrap、handler 模式、HTTP 契约、中间件 fixture 和压测协议;唯一变量是 Adapter。
  • 本机和本负载下 Native 的吞吐最高。 这是当前环境观测,不是它在所有环境中都最优的承诺。
  • 本样本中 Fastify 与 Koa 的吞吐随后,Hono 与 Express 则取舍各自的编程模型和生态。 对于较小差异,请结合 CV 和延迟数据判断。
  • 先按集成和迁移需求选择,再用你的业务复测。 Native 是依赖更轻的默认路径;需要相应生态时选择 Fastify、Express、Koa 或 Hono。

范围说明: 本页比较同一个 Vext Normal 应用通过不同 Vext Adapter 的开销。表中的 FastifyHonoExpressKoa 列不是这些框架的独立或裸性能,也不代表它们各自推荐生产配置的性能。生产选型请以你的应用、实际中间件与部署配置的压测为准。

当前结果

本次正式运行记录于 2026-08-15T00:07:37.413Z,使用干净的 Vext 源码 main@772d3eab9f3826a55526deaf2ad6b1c128bda446(Vext 1.0.1;Node.js v20.20.2)。所有数字均为 7 轮 req/s 的中位数,数值越高表示该测试场景中的吞吐越高。

场景NativeHonoFastifyExpressKoa
JSON 响应25,085.8211,158.1922,191.287,651.8219,017.46
参数路由24,773.110,65221,961.467,554.3718,678.55
处理器业务链21,802.919,38718,865.67,155.216,527.64
route middleware 链21,584.739,38318,729.17,137.6416,219.64

全部 20 个 Adapter/场景测量均为零错误、零超时、零非 2xx 响应。每个场景的 CV 在 0.2%–1.4% 之间。完整的逐轮样本、P50/P99、精确版本、provenance 和路由生命周期 telemetry 均在本页下方。

为什么这样对比

面向使用者的决策是选择哪个 Vext Adapter,所以每个目标均运行同一个 Vext Normal 应用。routes、defineRoutes() 加载、路由匹配、请求/响应对象、中间件 fixture、handler 模式、响应契约、进程优先级和 Autocannon 协议均保持不变,唯一变量是 Adapter。

fixture 有意关闭这些 GET 场景不使用的可选请求能力:access log、生成的 request ID、CORS、rate limit、response wrap、body parser、request context、session、CSRF、security headers、frontend render 和应用日志。它仍保留 Normal bootstrap 与路由生命周期。因此比较具有聚焦性和可复现性,但它不是全能力生产负载,也不是数据库/I/O 基准。

为什么不发布“生产栈排行”或“裸路径排行”?

生产压测是上线前的必要步骤,但认证、日志、安全、中间件、数据与外部 I/O、部署拓扑、硬件和业务复杂度都会不同。把这些结果放进一张跨框架 RPS 表,测到的是整套应用组合,不能可靠归因为框架或 Adapter。

另一端的裸路径或最短 HTTP 路径对维护者有诊断价值,但会省略 Vext 使用者实际选择的 Normal bootstrap、路由生命周期、请求/响应适配和中间件集成,因此不应用作用户选型排名。

本页固定同一个 Vext Normal 应用与压测协议,只更换 Adapter。它衡量的是固定、可复现负载下的 Vext Adapter 集成路径开销,不是 Fastify、Hono、Express 或 Koa 的独立性能。生产选型仍应以你的真实应用压测为准。

如何选择

需求建议起点需要注意
新项目、希望减少 HTTP 框架依赖Native(默认)用真实业务负载确认吞吐与延迟目标
已确定需要 Fastify 相关能力FastifyVext middleware 与底层原生 middleware 的签名不同,先核对集成边界
从 Express 或 Koa 迁移、团队已有经验对应 adapter不要仅依据开销百分比选择,先验证现有中间件的迁移方式
Node.js 服务中需要 Hono / Web Standards 风格Hono当前是 Node.js adapter,不是 Edge 运行时承诺;对 bridge 敏感负载应实测

详细安装和配置请参见 Adapter 指南

测试口径

项目当前正式样本
环境Node.js 20.20.2、Windows x64、Intel i7-9700、32 GiB RAM
负载50 connections、pipelining 10、每次测量 10 秒
稳定性5 秒预热、7 轮中位数、轮次顺序轮转、CV ≤ 20%
进程runner 与被测子进程使用相同 normal 优先级 0
依赖Fastify 5.12.0、Hono 4.13.2、@hono/node-server 2.1.1、Express 5.2.1、Koa 3.2.1、@koa/router 15.7.0、Autocannon 8.0.0

正式运行前,runner 会将这些依赖与当日 npm latest 核对;任一版本、源码身份、非 2xx、连接错误、超时、缺失结果或 CV 门禁失败都会拒绝生成可引用报告。目标按轮次交错执行,减少时间漂移固定偏向某一实现。

完整正式样本

此完整正式样本与上方当前结果摘要由同一 artifact 生成,并保留在本页中,使结论、方法和每一条测量数据可以一起审阅。

运行身份

字段
记录时间(UTC)2026-08-15T00:07:37.413Z
源码版本main@772d3eab9f3826a55526deaf2ad6b1c128bda446
源码状态clean(正式公开的必需条件)
Vext1.0.1
Node.jsv20.20.2
协议10s × 7 rounds; 50 connections; pipelining 10; 5s warmup; sync handler; CV ≤ 20%

场景

路径场景覆盖内容
/jsonJSON 响应路由匹配与 JSON 序列化。
/users/42参数路由动态路由匹配与参数提取。
/chain处理器业务链三层 handler 业务逻辑与 JSON 响应。
/middleware-chainroute middleware 链三层 route-level middleware 与 JSON 响应。

每一个测量样本

场景AdapterRPS 样本(所有轮次)中位数P50P99错误 / 超时 / 非 2xxCV
JSON 响应Native25,688, 25,085.82, 25,208, 25,256, 24,720, 24,908.37, 24,882.1925,085.8219 ms25 ms0 / 0 / 01.2%
JSON 响应Hono11,269.46, 11,145.6, 11,156, 11,209.1, 11,214.4, 10,998.4, 11,158.1911,158.1943 ms71 ms0 / 0 / 00.7%
JSON 响应Fastify22,609.6, 22,004.8, 22,227.64, 22,191.28, 21,988.8, 22,170.91, 22,329.622,191.2822 ms27 ms0 / 0 / 00.9%
JSON 响应Express7,668.8, 7,657.64, 7,635.6, 7,651.82, 7,677.64, 7,610.37, 7,636.197,651.8264 ms78 ms0 / 0 / 00.3%
JSON 响应Koa19,080, 19,008.73, 19,257.46, 18,901.1, 19,017.46, 18,864, 19,206.5519,017.4625 ms32 ms0 / 0 / 00.7%
参数路由Native24,690.19, 24,688, 24,938.91, 25,001.46, 24,773.1, 24,784.73, 24,419.6424,773.119 ms26 ms0 / 0 / 00.7%
参数路由Hono10,735.64, 10,555.28, 10,652, 10,564.73, 10,725.46, 10,541.46, 10,668.7310,65246 ms77 ms0 / 0 / 00.7%
参数路由Fastify21,961.46, 21,808, 21,654.4, 22,191.28, 22,123.2, 22,031.28, 21,868.821,961.4622 ms28 ms0 / 0 / 00.8%
参数路由Express7,572.8, 7,572.91, 7,518, 7,554.37, 7,507.82, 7,567.46, 7,553.287,554.3765 ms86 ms0 / 0 / 00.3%
参数路由Koa18,960.41, 18,535.64, 18,687.28, 18,348, 18,707.64, 18,625.2, 18,678.5518,678.5525 ms31 ms0 / 0 / 00.9%
处理器业务链Native21,933.82, 22,182.4, 22,205.82, 21,493.1, 21,670.55, 21,802.91, 21,582.421,802.9122 ms28 ms0 / 0 / 01.2%
处理器业务链Hono9,404.21, 9,437, 9,313.8, 9,495.4, 9,276.21, 9,331.46, 9,3879,38752 ms88 ms0 / 0 / 00.8%
处理器业务链Fastify18,973.82, 18,865.6, 19,245.82, 18,819.2, 19,152, 18,590, 18,853.218,865.625 ms31 ms0 / 0 / 01.1%
处理器业务链Express7,130.73, 7,159.1, 7,150.8, 7,152.4, 7,194.4, 7,155.2, 7,164.47,155.269 ms91 ms0 / 0 / 00.2%
处理器业务链Koa16,711.6, 16,630.8, 16,662.8, 16,527.64, 16,469.6, 16,524, 16,351.6416,527.6429 ms38 ms0 / 0 / 00.7%
route middleware 链Native21,670.55, 21,548.37, 21,654.4, 21,584.73, 21,545.46, 21,513.6, 21,957.121,584.7322 ms28 ms0 / 0 / 00.6%
route middleware 链Hono9,401.4, 9,203.4, 9,389.64, 9,204.21, 9,397.4, 9,224.21, 9,3839,38351 ms88 ms0 / 0 / 01.0%
route middleware 链Fastify18,635.28, 18,576.41, 18,729.1, 18,825.46, 18,776, 18,462.91, 18,806.5518,729.125 ms32 ms0 / 0 / 00.7%
route middleware 链Express7,418.4, 7,117.64, 7,137.64, 7,159.46, 7,114, 7,156.4, 7,1267,137.6469 ms90 ms0 / 0 / 01.4%
route middleware 链Koa16,374.91, 16,171.28, 16,281.1, 16,132, 16,358.19, 16,219.64, 16,08016,219.6429 ms40 ms0 / 0 / 00.6%

Normal 路由生命周期 telemetry

场景Adapter全局 middleware路由注册链状态
JSON 响应Native12已断言
JSON 响应Hono12已断言
JSON 响应Fastify12已断言
JSON 响应Express12已断言
JSON 响应Koa12已断言
参数路由Native12已断言
参数路由Hono12已断言
参数路由Fastify12已断言
参数路由Express12已断言
参数路由Koa12已断言
处理器业务链Native12已断言
处理器业务链Hono12已断言
处理器业务链Fastify12已断言
处理器业务链Express12已断言
处理器业务链Koa12已断言
route middleware 链Native15已断言
route middleware 链Hono15已断言
route middleware 链Fastify15已断言
route middleware 链Express15已断言
route middleware 链Koa15已断言

精确环境与版本

项目精确值
平台win32 x64
CPUIntel(R) Core(TM) i7-9700 CPU @ 3.00GHz
内存32 GiB
进程优先级0
Vext1.0.1
Hono4.13.2
@hono/node-server2.1.1
Fastify5.12.0
Express5.2.1
Koa3.2.1
@koa/router15.7.0
Autocannon8.0.0
npm latest 核验2026-08-14T23:36:04.874Z (https://registry.npmjs.org)

自己复现

先安装锁文件中的依赖并确认 benchmark 版本仍是当前 npm latest

npm ci
npm run verify:benchmark-deps

运行与本页一致的公开 Adapter 对照:

node --expose-gc --max-old-space-size=512 test/benchmark/run-adapter-matrix.mjs --formal --scenario all --duration 10 --connections 50 --pipelining 10 --warmup 5 --rounds 7 --max-cv 20 --process-priority 0 --handler-mode sync

本样本使用同步 handler。如果你的平台或权限需要不同的优先级,请改用可用值,并将结果视为新的环境基线,不要直接与本页绝对数值比较。

runner 使用本地 Autocannon programmatic API,会自动启动和停止测试目标。本页包含全部样本、P50/P99、精确版本、provenance 和路由生命周期 telemetry;完整参数、adapter matrix 命令和 artifact 合并规则见 benchmark README

测试真实应用

框架微基准只回答“核心 HTTP 路径的成本”。上线前至少应在与你的生产环境相近的机器上加入:

  1. 实际认证、日志、响应包装和中间件;
  2. 数据库、缓存和外部 API 的真实或可控替身;
  3. 预热、多个轮次、吞吐、P95/P99、错误率和资源占用;
  4. 与生产一致的 Node.js 版本、进程数、容器限额和反向代理。

限制

  • 当前结果来自一台 Windows 主机,不代表 Linux、容器或云环境。
  • 这是轻量 HTTP 微基准,不衡量开发体验、插件质量、可维护性或完整业务延迟。
  • 不同日期、机器、依赖版本、handler 模式或压测协议的绝对数字不可直接合并排名。
  • 本表只比较 Vext Adapter。裸框架与最短路径诊断单独维护,不是面向使用者的 Adapter 排名。

相关链接