# 📊 效能基準測試

吞吐量數字只有擺在產生它的條件旁邊才有意義。本頁提供最新一次的比較，並在旁邊列出每一項限制其解讀範圍的條件。

## 🧭 比較方式

- **版本。** 量測用的 Pingclair 是候選版本 `v0.2.0-rc.3` 的發行二進位檔，另有 nginx 1.31.6 與 Caddy 2.11.4。之後的修補版本不會重新量測。
- **主機。** 一台執行 OrbStack 的 Apple M2 筆電。
- **限制。** 每個伺服器都跑在限制兩顆 CPU 的容器裡，worker 數相同，payload 同為 1 KiB。
- **拓撲。** 反向代理的後端跑在同一個 Docker network 上的獨立容器。
- **負載產生器。** HTTP/1.1、HTTPS/1.1 與 HTTP/2 使用原生 `h2load`；HTTP/3 使用同一個 Docker network 內、支援 ngtcp2 的 `h2load`。

## 📊 結果

每個數值都是每秒請求數：三輪交錯執行、每輪 50,000 個請求的中位數。只有全部請求都成功，該列才算數。

| 場景 | Pingclair | nginx 1.31.6 | Caddy 2.11.4 |
| --- | ---: | ---: | ---: |
| HTTP/1.1 靜態 | 46,125 | 39,478 | 18,266 |
| HTTPS/1.1 靜態 | 40,721 | 31,508 | 19,978 |
| HTTP/2 靜態 | 92,369 | 41,972 | 17,424 |
| HTTP/3 靜態 | 56,180 | 55,638 | 22,912 |
| HTTP/1.1 反向代理 | 20,856 | 22,584 | 17,117 |
| HTTPS/1.1 反向代理 | 20,297 | 21,944 | 16,660 |
| HTTP/2 反向代理 | 23,181 | 20,396 | 未完成 |
| HTTP/3 反向代理 | 28,078 | 22,213 | 未完成 |

與 nginx 相比，Pingclair 在 HTTP/1.1、HTTPS/1.1 與 HTTP/2 的靜態列領先（分別為 1.2 倍、1.3 倍與 2.2 倍），HTTP/3 靜態則大致打平。反向代理負載下，HTTP/2 領先 14%、HTTP/3 領先 26%，HTTP/1.1 與 HTTPS/1.1 則仍落後 nginx 約 8%。

## 📐 限制這些數字的條件

- **主機是一台筆電。** 絕對吞吐量不代表容量宣稱，這些比值也只描述在這組受控負載下的相對表現。
- **只在同一列內比較。** HTTP/3 的負載產生器與其他列跑在不同環境，因此不應跨協定比較絕對吞吐量，只能在同一列內比較各伺服器。
- **未完成的列不構成比較。** 在這台主機與這套 harness 上，Caddy 沒能完成反向代理的 HTTP/2 與 HTTP/3 兩列：在受測的並行數下，上游連線的反覆建立耗盡了容器可用的臨時連接埠。這兩格標為未完成，而不是改用另一種負載去量。
- **結果取決於主機。** 各伺服器的相對位置會隨 CPU 架構、核心、worker 數與 TLS 實作而改變。

## 🧾 來源

這些數字來自伺服器儲存庫的 benchmark harness 的一次執行結果。量測方法、一次執行必須滿足哪些規則數字才算數，以及 harness 本身，都公布在該儲存庫：

- [基準測試方法](https://github.com/dorianverlaine/pingclair/blob/main/benchmarks/README.md)

每次執行的原始紀錄留在維護者的 checkout，不公開。
