跳转到内容

quicX 性能基准线文档

平台: macOS ARM64 (Apple Silicon M3 Pro, 14 cores)

编译: CMake RelWithDebInfo, Clang, -O2 -g

框架: Google Benchmark v1.8.3


基准测试时间吞吐量说明
TlsCtxCreation~16 ns—TLS 上下文对象创建(轻量)
基准测试负载大小时间吞吐量
BufferWriteRead64 B4.42 μs27.6 MiB/s
BufferWriteRead256 B5.34 μs91.5 MiB/s
BufferWriteRead1200 B4.43 μs516.7 MiB/s
BufferWriteRead4096 B4.62 μs1.65 GiB/s
BufferWriteRead16384 B19.3 μs1.58 GiB/s
BufferEncodeVarInt—132 ns22.7M items/s

分析: Buffer 操作对于典型 QUIC 包大小(1200B)表现优秀,吞吐量超过 500 MiB/s。

基准测试时间吞吐量
AckFrameEncode4.33 μs231K frames/s
AckFrameDecode4.54 μs220K frames/s
StreamFrameEncode9.05 μs110K frames/s

分析: ACK 帧编解码约 4.4μs,对于 QUIC 协议的性能要求完全满足。

基准测试时间吞吐量
QpackEncode (9 headers)6.19 μs1.46M headers/s
QpackDecode (5 headers)4.82 μs1.04M headers/s
HuffmanEncode (15 chars)139 ns103 MiB/s
HuffmanDecode (11 bytes)36.1 ns317 MiB/s

分析: QPACK 编码性能良好。Huffman 解码比编码快约 3x,表明解码查表效率高。

分配器大小时间加速比 vs malloc
Poolallocator16 B2.10 ns6.2x
Poolallocator64 B2.10 ns6.0x
Poolallocator128 B2.06 ns6.1x
Poolallocator256 B2.06 ns12.6x
BlockMemoryPool1024 B7.13 ns1.5x
BlockMemoryPool4096 B7.13 ns1.5x
BlockMemoryPool16384 B6.99 ns1.6x
std::malloc16 B13.0 ns1.0x
std::malloc256 B28.5 ns1.0x
std::malloc4096 B10.6 ns1.0x

关键发现:

  • Poolallocator 小对象(≤256B): 比 malloc 快 6-13x,仅需 ~2ns
  • BlockMemoryPool 大块(1K-16K): 比 malloc 快 1.5x,~7ns
  • 自定义分配器对 QUIC 包处理的内存管理有显著优势
基准测试时间吞吐量
PacketProcessingSimulation0.168 μs6.67 GiB/s

分析: 完整的每包处理路径(分配 + 写入 + 解析头部 + 读取帧数据)仅 168 ns,理论上支持 5.95M 包/秒。


Buffer 容量创建时间Chunk 数量
1 KiB5.34 μs1
4 KiB5.37 μs1
16 KiB5.27 μs1
64 KiB23.8 μs多个
块大小100 块分配后池大小释放后池大小ReleaseHalf 后
1 KiB282814
4 KiB282814
16 KiB282814

分析: BlockMemoryPool 批量分配策略效率高。ReleaseHalf 可回收约 50% 空闲内存。

指标值
初始 RSS~108 MB
10K 次分配/释放循环后 RSS~108 MB
RSS 增长0 KB

结论: 在重复分配/释放循环中未观察到内存增长,表明内存池没有泄漏。

写入数据量Chunk 数量写入吞吐量
4 KiB12.47 GiB/s
16 KiB46.62 GiB/s
64 KiB1612.06 GiB/s
256 KiB6414.64 GiB/s

分析: Buffer Chain 的写入吞吐量随数据量增长而提高(摊薄了对象创建开销),64 chunk 时达到 14.6 GiB/s。


工作模式Poolallocatorstd::malloc加速比
混合分配/释放356 ns1108 ns3.1x
包数量总时间平均每包
101.59 μs159 ns
10015.9 μs159 ns
1000159 μs159 ns

分析: 每包 Buffer 分配+使用+释放开销稳定在 159 ns,线性可扩展。

初始容量请求块数最终池大小释放后池大小
4 块102 (空闲)12 (返回池)
4 块50212
4 块200020
4 块500020

以下阈值可作为性能回归检测的参考标准(对比两次运行的 JSON 报告偏差):

指标类别阈值说明
默认阈值15%超过此值标记为回归
关键路径10%包处理、帧编解码
分配器20%内存分配操作(对外部因素更敏感)

基于基准线数据的优化方向:

  1. Buffer 创建开销(~5μs): 考虑 Buffer 对象池,避免每包创建新 Buffer
  2. StreamFrame 编码(9μs): 比 AckFrame(4.3μs)慢 2x,可能有优化空间
  3. QPACK 编码(6μs/请求): 对于高频 HTTP/3 请求,动态表命中率是关键
  4. BlockMemoryPool 线程安全: 多线程下有锁竞争,可考虑 per-thread pool

终端窗口
# 构建
cmake -B build -DENABLE_PERF_TESTS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build -j
# 运行 CPU 热点基准
./build/bin/perf/cpu_hotspot_test
# 运行内存基准
./build/bin/perf/memory_baseline_test
# 运行内存池效率分析
./build/bin/perf/memory_pool_efficiency_test
# 输出 JSON 报告
./build/bin/perf/cpu_hotspot_test --benchmark_format=json --benchmark_out=perf_results/cpu_hotspot.json
# 保存 JSON 报告作为性能基准线(下次运行结果与此对比)
./build/bin/perf/cpu_hotspot_test --benchmark_format=json --benchmark_out=baseline/cpu_hotspot.json
# 采样剖析 30 秒并生成火焰图(collapsed 栈可直接喂给 flamegraph.pl)
./build/bin/perf/profile_decode_packets --seconds 30 --out /tmp/decode_stacks.raw
python3 test/perf/tools/resolve_stacks.py /tmp/decode_stacks.raw
# ASan 内存分析(用 -DSANITIZER=asan 单独构建后运行单测)
cmake -B build-asan -DSANITIZER=asan -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build-asan -j
./build-asan/bin/quicx_utest

选项默认值说明
ENABLE_PERF_TESTSON构建性能分析测试(test/perf,含采样 profiler 工具)
SANITIZER(空)取值 asan / ubsan / tsan,启用对应 sanitizer 构建

注:perf 目标自带分析友好编译标志(-O2 -g -fno-omit-frame-pointer),无需单独的分析开关。