24、48、96 KiB:哪个业务场景更能体现优势?

全部队列使用相同工作集。TwoBufQueue第一层总池固定16 KiB,第二层256 MiB;开源队列使用常规入队方式及256 MiB槽位存储。

本次选择:48 KiB业务工作集

怎样选最优

综合1、2、4、8、16 MiB发送量和三次独立运行。每个条件重复8次“发送消息 → 执行64次业务”,取这8个业务窗口耗时的中位数,减少偶发停顿的影响。

同条件下,用最快开源对照的业务耗时 ÷ TwoBufQueue的业务耗时得到优势倍数,再综合15个条件取几何平均。大于1表示TwoBufQueue更快;要求多数条件占优、至少两次独立运行综合占优。选得分最高的共同业务工作集。

业务工作集综合优势倍数 ↑占优条件数三次独立优势倍数
24 KiB1.428×9 / 151.443× / 1.568× / 1.287×
48 KiB1.796×15 / 151.903× / 1.665× / 1.830×
96 KiB1.788×13 / 151.730× / 1.548× / 2.134×

这里选择的是展示用的业务场景。业务表大小是负载参数,全部队列共同采用所选大小;没有给不同队列设置不同业务负载。倍数来自重复业务窗口的中位数比较,不能当作p50、p99或p999。

全部参数的业务耗时

“前”为发消息前16次业务的平均耗时;“后”为发消息后紧接着64次业务的平均耗时。每次业务访问并更新8个节点。数值是三次独立运行、每次8个窗口的均值。

工作集发送量queue前均值 ns/次后均值 ns/次
24 KiB1 MiBTwoBufQueue14.820.1
24 KiB1 MiBReaderWriterQueue14.319.0
24 KiB1 MiBrigtorp::SPSCQueue14.916.6
24 KiB1 MiBatomic_queue14.927.6
24 KiB2 MiBTwoBufQueue14.319.3
24 KiB2 MiBReaderWriterQueue13.919.4
24 KiB2 MiBrigtorp::SPSCQueue13.719.6
24 KiB2 MiBatomic_queue14.432.9
24 KiB4 MiBTwoBufQueue14.424.1
24 KiB4 MiBReaderWriterQueue14.036.7
24 KiB4 MiBrigtorp::SPSCQueue13.132.0
24 KiB4 MiBatomic_queue13.836.9
24 KiB8 MiBTwoBufQueue13.926.1
24 KiB8 MiBReaderWriterQueue13.549.6
24 KiB8 MiBrigtorp::SPSCQueue13.348.4
24 KiB8 MiBatomic_queue14.153.5
24 KiB16 MiBTwoBufQueue14.029.4
24 KiB16 MiBReaderWriterQueue14.160.5
24 KiB16 MiBrigtorp::SPSCQueue13.580.5
24 KiB16 MiBatomic_queue15.372.3
48 KiB1 MiBTwoBufQueue13.915.5
48 KiB1 MiBReaderWriterQueue13.928.0
48 KiB1 MiBrigtorp::SPSCQueue13.616.7
48 KiB1 MiBatomic_queue15.339.7
48 KiB2 MiBTwoBufQueue13.921.1
48 KiB2 MiBReaderWriterQueue13.833.4
48 KiB2 MiBrigtorp::SPSCQueue13.523.9
48 KiB2 MiBatomic_queue13.642.5
48 KiB4 MiBTwoBufQueue14.232.3
48 KiB4 MiBReaderWriterQueue14.055.7
48 KiB4 MiBrigtorp::SPSCQueue13.134.2
48 KiB4 MiBatomic_queue14.054.2
48 KiB8 MiBTwoBufQueue14.226.3
48 KiB8 MiBReaderWriterQueue14.3165.4
48 KiB8 MiBrigtorp::SPSCQueue13.375.5
48 KiB8 MiBatomic_queue12.777.8
48 KiB16 MiBTwoBufQueue12.681.9
48 KiB16 MiBReaderWriterQueue14.6108.6
48 KiB16 MiBrigtorp::SPSCQueue14.5142.9
48 KiB16 MiBatomic_queue14.0145.5
96 KiB1 MiBTwoBufQueue14.426.5
96 KiB1 MiBReaderWriterQueue14.045.0
96 KiB1 MiBrigtorp::SPSCQueue14.532.1
96 KiB1 MiBatomic_queue17.953.5
96 KiB2 MiBTwoBufQueue14.529.5
96 KiB2 MiBReaderWriterQueue13.951.1
96 KiB2 MiBrigtorp::SPSCQueue14.837.7
96 KiB2 MiBatomic_queue14.359.5
96 KiB4 MiBTwoBufQueue15.631.5
96 KiB4 MiBReaderWriterQueue15.591.4
96 KiB4 MiBrigtorp::SPSCQueue14.447.3
96 KiB4 MiBatomic_queue14.878.7
96 KiB8 MiBTwoBufQueue14.135.0
96 KiB8 MiBReaderWriterQueue14.1120.4
96 KiB8 MiBrigtorp::SPSCQueue14.590.5
96 KiB8 MiBatomic_queue13.9124.5
96 KiB16 MiBTwoBufQueue14.475.4
96 KiB16 MiBReaderWriterQueue14.4225.7
96 KiB16 MiBrigtorp::SPSCQueue16.9271.1
96 KiB16 MiBatomic_queue14.2262.0
测试参数与原始数据

32 B消息,每个字段随序号变化;业务热身512次;每16次业务计时一组;后64次包含4组。回调持续执行256次计算,不人为暂停。按发送量预填充,发送后未处理数据接近256 MiB容量的80%。

TwoBufQueue采用普通write、整块发布、不扫描当前块,源池4×4 KiB,输出池65,536×4 KiB;独立复制及回调线程。ReaderWriterQueue用try_enqueue及普通成员复制,rigtorp用try_push且不额外添加写预取,atomic_queue启用SPSC。

Apple M3,写线程高QoS,未硬绑核。全部消息通过条数、FIFO、完整32 B校验,同工作集下所有实现的业务校验和一致。当前为工作集筛选,分位数还需更多独立重复。

全部汇总及选择规则 · 运行清单、参数及哈希