Skip to content

收包缓冲与拆包性能

查看 Markdown

在 2026-10-15 的本机 Release 构建中完成 66 次测量。图表与表格保留全部配置,数据来自独立 C++ 程序。

初始缓冲与拆包吞吐量,中位数和测量范围

测试环境

项目 配置
机器 Mac mini Mac16,11, Apple M4 Pro, 14 核, 48 GiB
OS macOS 27.0.1 (26A434), arm64
编译器 Apple clang version 21.0.0 (clang-2100.3.34.2)
构建 Release (-O3 -DNDEBUG -std=gnu++20 -fPIC), C++20, Boost 1.90.0; arknet 848588e409bf7e5f86bc30b8ffae7efb022eb6e4
重复与预热 3 次;拆包每次预热 10000 批

结果

10,000 个会话的初始收包缓冲申请量:5,000 MiB → 39.1 MiB(减少 99.22%)。这是应用层缓冲数组的容量;socket 缓冲、队列和其他对象另计。

消息体 / B 输入块 / B 每批消息 原实现 / msg/s 优化实现 / msg/s 变化 原 CPU / % 优化 CPU / %
64 65536 1 17,519,100 18,455,000 +5.3% 100.0 100.0
1024 65536 1 10,460,500 10,490,300 +0.3% 99.9 100.0
4096 65536 1 4,476,530 4,828,650 +7.9% 100.0 100.0
1024 64 1 2,374,330 5,935,260 +150.0% 100.0 100.0
4096 1 1 12,316 56,783 +361.0% 100.0 100.0
1024 64 16 2,526,070 5,684,930 +125.1% 99.9 100.0
4096 65536 16 3,932,370 3,396,780 -13.6% 100.0 100.0
  • 1 KiB / 64 B 输入块:每消息普通对象分配 18 → 2。
  • 4 KiB / 逐字节输入:每消息普通对象分配 4098 → 2。
  • 4 KiB / 64 KiB 输入块 / 每批 16 条:吞吐量变化 -13.6%,作为内存与吞吐量的取舍保留。

CPU 100% 代表占满一个逻辑核心。程序单线程运行,计时包含消息内容校验。连接容量、网络吞吐量和 RTT 需另做端到端验收。

初始容量选择

三种初始容量的拆包吞吐量

消息体 / B 输入块 / B 每批消息 初始容量 / KiB 吞吐量 / msg/s CPU / %
1024 64 1 4 5,979,210 100.0
1024 64 1 64 5,979,600 100.0
1024 64 1 512 5,932,350 100.0
4096 65536 16 4 3,295,860 100.0
4096 65536 16 64 3,320,350 100.0
4096 65536 16 512 3,830,120 100.0

默认初始容量为 4 KiB,缓冲按需增长。大批量输入可在端点启动前通过 set_initial_receive_buffer_size(bytes) 配置较大容量;零值或运行中修改返回 false。此容量是应用层拆包缓冲,与 socket 收发缓冲分开设置。

复现与原始记录

对照版本使用同一份基准源码。每轮依次运行原实现、默认容量的优化实现和各容量配置,共三轮;每组独立启动进程,测量期间没有并行编译。

导航

输入关键词开始搜索…

↑↓ 移动↵ 选择Esc 关闭