性能
secnetperf 风格微基准,loopback UDP。吞吐以真实 TLS 1.3 握手测量(quic-go
BenchmarkTransfer 模型);installed-keys 旁路仅用于单点延迟微基准。loopback 吞吐
run 间波动 ±20%——趋势与量级比绝对值更重要。
~390 MB/s
单流 · 真实握手
21.7 μs
回声延迟 · P50
~304 MB/s
4 流聚合
| 口径 | 单流 | 握手 | 含义 |
|---|---|---|---|
installed-keys,线程化 std.Io |
~1.94 GB/s | 旁路 | 原始传输上限(README 表头);跳过 transport parameters 协商 |
| 真实 TLS 1.3 握手 | ~310–440 MB/s | 真实 | 真实客户端能拿到的数字;本页表头 |
installed-keys 旁路握手(即跳过 RFC 9000 §7.4 的 transport parameters 协商), ~1.94 GB/s 应读作上限,而非面向客户端的数字。
UDP loopback,真实握手
Section titled “UDP loopback,真实握手”| 指标 | 数值 | 说明 |
|---|---|---|
| 单流吞吐 | ~310–440 MB/s | 3 次实测 313 / 318 / 440(run 间 ±20%) |
| 握手耗时 | ~0.6–1.0 ms/轮 | TLS 1.3,transport parameters 经协商(RFC 9000 §7.4) |
| 传输 | 64 MB/轮 | 8900 B datagram,CUBIC,100μs receiveTimeout |
| 百分位 | 延迟 |
|---|---|
| P50 | 21.7 μs |
| P99 | 77.3 μs |
| P99.9 | 175.9 μs |
5000 次迭代,真实握手后 1 KB 完整 QUIC 往返。
| 多流(4 并发) | 数值 | 说明 |
|---|---|---|
| 聚合 | ~304 MB/s | stddev 4.5%,比单流更稳 |
| 丢包率 | 吞吐量 | 说明 |
|---|---|---|
| 1%(loopback) | 452 MB/s | CUBIC 快速恢复 |
| 5%(loopback) | 303 MB/s | |
| 1%(100μs RTT) | 126 MB/s | |
| 5%(100μs RTT) | 120 MB/s |
内存直连,单线程
Section titled “内存直连,单线程”无 UDP 开销——隔离连接 / CRYPTO 状态机。
| 指标 | 数值 | 说明 |
|---|---|---|
| 流上传(16 MB) | 0.35 GB/s | CUBIC,cwnd = 272 KB |
| Echo P50 | 7.5 μs | 1 KB 完整 QUIC 往返(内存直连) |
| Echo P99 | 47.7 μs | 长尾受 OS 调度影响 |
| Echo P99.9 | 665.2 μs | |
| 4 流聚合(4×4 MB) | 0.34 GB/s | 共享 cwnd |
CPU 占用(真实握手全套)
Section titled “CPU 占用(真实握手全套)”| 指标 | 数值 |
|---|---|
| Real time | 3.90 s |
| User CPU | 3.21 s(约 82% 单核) |
| Sys CPU | 4.25 s(约 109%,多核累积) |
| Peak RSS | ~2.4 GB(bench arena 跨迭代累积,非生产单连接) |
sys CPU 高来自每包 UDP sendto/recvfrom 系统调用;吞吐受 ACK 时钟与共享 I/O 路径限制,
非纯 CPU 算力。
跨实现吞吐数字引自外部基准(secnetperf、KIT 2025、TQUIC、quic-go#3670)——非 quicz 实测。完整带来源表格见功能对比页。
nanoTime() 辅助有 Linux clock_gettime 分支,且所有 bench 产物可在 Linux 构建,所以套件也能跑在
原生 aarch64 Linux 容器。那里的 loopback 走 Docker 虚拟网卡,因此数字是环境受限上限,非 quicz 极限:
| 指标 | macOS(原生) | aarch64 Linux 容器 |
|---|---|---|
| 单流(真实握手) | ~426–507 MB/s | ~51 MB/s(docker veth UDP ~60 MB/s 上限) |
| DATAGRAM | ~199 MB/s | ~64 MB/s |
| Echo 延迟 P50 | 20.1 μs | 31.6 μs |
真实裸机 Linux 吞吐需要非虚拟化主机。两条运行时注记:drainOutgoing 通过 sendMany 批量发送
(Linux 每批一个 sendmmsg 系统调用;macOS 保持每 datagram 发送),接收缓冲池化(16 项池替代每
datagram 分配)。
- 协议 —— QUIC v1;吞吐每连接做真实 TLS 1.3 握手;installed 1-RTT 密钥仅用于延迟微基准。
- 套接字 —— loopback UDP,8900 字节 datagram(macOS UDP 上限 9000B)。
- I/O 层 ——
std.Io.Threaded(跨平台,Linux 自动启用 sendmmsg 批量)。 - 构建 ——
zig build-exe -OReleaseFast。 - 平台 —— Apple M 系列,macOS,Zig 0.16。
- 拥塞 —— CUBIC(RFC 8312/9438);ns 精度 token bucket pacer。
- 波动 —— run 间 ±20%(系统负载、CUBIC 窗口动态、热状态);多次跑以区间给出。
# 标准化套件:以 ReleaseFast 构建每个基准,按固定顺序全跑,并把平台/commit 元数据# 与完整输出记到 bench_results/<UTC 时间戳>_<commit>.log(已提交结果做基线)scripts/run_bench_suite.shzig build bench-suite # 同顺序,不记录结果
# 单个基准zig build run-quic-bench # installed-keys 微基准zig build run-quic-bench-hs # 真实握手吞吐 + 延迟zig build run-quic-bench-simple # 单线程原始处理zig build run-quic-bench-datagram # RFC 9221 DATAGRAM 吞吐zig build run-quic-bench-profile # 逐阶段剖析zig build run-congestion-bench # NewReno vs CUBIC 模拟丢包如何读这些数字
Section titled “如何读这些数字”- 真实握手,非旁路。 吞吐每轮新建 TLS 1.3 握手,transport parameters 经协商(RFC 9000 §7.4);installed-keys 跳过协商,仅作延迟点。
- ±20% 波动。 loopback 上 CUBIC 在 ~1μs RTT 的窗口动态使单流 noisy;多流聚合更稳。 数字按量级读。
- macOS 无 GSO / XDP。 每包主成本是 QUIC 处理 CPU(AES-128-GCM 硬件加速 ~4.9μs/包 +
成帧);UDP
sendto~3.5–4.7μs/包非主因。Linux GSO/GRO(3–10x)或 XDP 可提升 quicz。 - Go / Rust 在 Linux 受益于零拷贝
sendmsg+ GSO,本次未涉及。
- 回声延迟(P50 / P99 / P99.9)
- 多流并发(4 流)
- 丢包恢复(1% / 5%,loopback + 100μs RTT)
- CPU 占用
- DATAGRAM 吞吐(RFC 9221)
- 外部互通吞吐(quic-go / quiche / s2n-quic 对端)
- TQUIC Benchmark —— 腾讯多条件 QUIC 基准
- QUIC Interop Runner —— 互通 + pcap 吞吐
- KIT 性能全景 (2025) —— 学术多实现对比
- secnetperf —— 微软 QUIC 性能工具