跳转至

HTTP 服务器性能测试

zerodep httpserver 与 Flaskmicrodotbottle 的端到端服务性能对比。

测试环境

  • CPU: x86_64 Linux
  • Python: 3.12
  • 工具: pytest-benchmark 5.2.3(报告均值)
  • 参考库: Flask 3.1.3、microdot 2.6.1、bottle 0.13.4
  • 最后更新: 2026-05-02

实现方式

实现 类型 描述
zerodep 异步(asyncio 单文件 HTTP 服务器,仅标准库
Flask 同步(WSGI) 全功能 Web 框架(werkzeug)
microdot 异步(asyncio 极简 Flask 风格异步框架
bottle 同步(WSGI) 单文件 WSGI 框架(wsgiref)

测试内容

每个框架在后台线程启动 HTTP 服务器。基准测试使用 zerodep httpclient 模块测量完整的请求-响应往返延迟。

测试场景

场景 描述 客户端
串行 GET JSON 单次 GET 返回 {"pong": true} 同步 get()
串行 POST JSON 单次 POST 回显小 JSON 负载 同步 post()
串行 GET 文本 单次 GET 返回 "Hello, World!" 同步 get()
同步 vs 异步处理器 对比 async defdef(仅 zerodep) 同步 get()
并发 GET (x10) 10 个同时发起的 GET 请求 asyncio.gather + async_get()
并发 POST (x10) 10 个同时发起的 POST 请求(含 JSON) asyncio.gather + async_post()
大负载 POST POST ~30KB JSON 请求体 同步 post()

关键发现

  • 串行延迟 -- 四个框架在单请求延迟上表现相近(~250-400 us),无明显优劣。
  • 并发处理 -- 异步框架(zerodep、microdot)处理 10 个并发请求约需 ~5 ms。WSGI 框架(Flask、bottle)串行处理请求,耗时约 ~1 秒(慢 200 倍)。
  • 同步处理器开销 -- asyncio.to_thread() 相比原生异步处理器增加约 20% 开销,但在并发负载下仍优于 WSGI 框架。
  • 大负载 -- JSON 解析/序列化吞吐在各框架间相当,瓶颈在 json.dumps()/json.loads() 而非 HTTP 层。
  • 零依赖 -- zerodep 在无 pip 依赖的情况下达到了 Flask/microdot 级别的性能。

自行运行

pip install pytest pytest-benchmark flask microdot bottle
pytest httpserver/test_httpserver_benchmark.py --benchmark-only -v

最新 CI 结果

每次发布时通过 Benchmark CI 自动更新。