English中文
TWOBUFQUEUE / SPSC BENCHMARK

256 MiB 缓存 · 回调循环为 0 · 普通 write · 每条 publish

比较生产者线程把消息发送到队列的速度和耗时:吞吐越高越好,生产者发送耗时的 p50 / p99 / p999 越低越好。与 ReaderWriterQueue、rigtorp/SPSCQueue、atomic_queue 对比。

每次 10,000,000 条3 次平均8 / 16 / 32 / 64 B 共用参数权重 35 / 30 / 20 / 15publish_count = 1is_scan_current = true高 QoS · 未硬绑核

本报告测什么?

测生产者向队列发送消息的吞吐与耗时:消息交给队列有多快,生产者每条消息要花多少时间。

对比 TwoBufQueue、ReaderWriterQueue、rigtorp/SPSCQueue 和 atomic_queue,消息长度为 8 / 16 / 32 / 64 B。TwoBufQueue 使用普通 write,每写入一条消息就发布进度,并开启当前块扫描。业务回调循环次数为 0,消费者仍正常接收消息并调用回调。

测试流程:提前准备消息 → 生产者连续发送并计时 → 停止计时 → 等待本轮消息消费完成。所有队列采用相同的消息条数和长度。

计时范围:计入生产者发送阶段的消息复制、进度发布、发送中发生的申请块或换块,以及可能的重试等待。输入准备、轮末交接与回调排空在计时外执行;复制和消费线程同时运行,仍会影响生产者的实际速度。

吞吐:成功发送的消息总数 ÷ 生产者累计发送时间,单位 M条/s(每秒百万条消息),越高越好。数据吞吐 GB/s 按消息净负载字节数计算。

p50、p99、p999 都是生产者线程发送消息耗时的分位数,越低越好。为精确测量很短的发送操作,每连续发送 1,000 条成功消息计时一次,再将这组时间除以 1,000,得到一个“平均每条发送耗时”样本。

p50(50% 分位):在一次运行中,50% 的分组样本,其平均每条发送耗时不超过这个值。

p99(99% 分位):在一次运行中,99% 的分组样本,其平均每条发送耗时不超过这个值。

p999(99.9% 分位):在一次运行中,99.9% 的分组样本,其平均每条发送耗时不超过这个值。

每次运行分别计算这些分位数,表中再取三次运行结果的平均值。这里衡量的是生产者提交消息的开销:分位数来自每组 1,000 条的平均耗时,不是单次 write 调用的分位数,也不是从发送到消费者收到消息的端到端延时。

吞吐概览

同一长度的四个队列放在一起;吞吐单位 M条/s。

完整数据与顺序校验通过按四项指标选定共同参数各队列每份报告只用一套调优参数

TwoBufQueue 两层数据池各固定 256 MiB,合计 512 MiB;原生 SPSC 的消息存储预算为 256 MiB。备用槽、padding 计入预算,控制结构另计。

每个队列的吞吐、p50、p99、p999 使用同一套参数,8 / 16 / 32 / 64 B 也共用这套调优参数。按权重 35% / 30% / 20% / 15% 综合选参,四种长度等权参与。原生容量随消息长度按固定字节预算推导,复制策略沿用各长度已固定的负载实现。

此次用共同参数对应的遍历阶段三次实测值更新表格,因此数值与旧版逐项独立选优不同;原始记录保留,ReaderWriterQueue 的邻域补测另外保存。

8 B吞吐 · M条/s
TwoBufQueue
489.55
ReaderWriterQueue
801.00
rigtorp/SPSCQueue
326.11
atomic_queue
186.30
16 B吞吐 · M条/s
TwoBufQueue
449.51
ReaderWriterQueue
767.38
rigtorp/SPSCQueue
267.48
atomic_queue
48.65
32 B吞吐 · M条/s
TwoBufQueue
378.65
ReaderWriterQueue
422.63
rigtorp/SPSCQueue
220.68
atomic_queue
30.20
64 B吞吐 · M条/s
TwoBufQueue
277.87
ReaderWriterQueue
204.26
rigtorp/SPSCQueue
99.42
atomic_queue
45.19

性能对比

同消息长度使用相同背景色;TwoBufQueue 整行加粗并描边。吞吐下方显示三次测量的最小值与最大值。

消息长度
实现 / 复制方式吞吐
M条/s
数据吞吐
GB/s
生产者发送耗时
p50 ns/条
生产者发送耗时
p99 ns/条
生产者发送耗时
p999 ns/条
背压%
8 B回调循环 0 次 · 每次 10,000,000 条 · 三次平均
TwoBufQueue普通 write · 首字节读回489.548488.993 – 489.9403.9162.0003.0427.2360%0 / 30,000,000
ReaderWriterQueue完整成员复制801.002649.604 – 893.9016.4081.2221.9722.6940%0 / 30,000,000
rigtorp/SPSCQueue成员复制+目标写预取326.105313.386 – 333.1832.6093.0004.3476.7080%0 / 30,000,000
atomic_queue完整成员复制186.298175.399 – 198.3431.4904.98617.58336.5420%0 / 30,000,000
16 B回调循环 0 次 · 每次 10,000,000 条 · 三次平均
TwoBufQueue普通 write · 首字节读回449.506446.715 – 451.3877.1922.1673.1674.5560%0 / 30,000,000
ReaderWriterQueue先清零,再完整 memcpy767.375724.706 – 800.67512.2781.3192.5695.6530%0 / 30,000,000
rigtorp/SPSCQueue成员复制+目标写预取267.481230.185 – 304.3284.2803.0975.8618.8610%0 / 30,000,000
atomic_queue完整成员复制48.65543.680 – 52.1570.77813.37540.08343.2780%0 / 30,000,000
32 B回调循环 0 次 · 每次 10,000,000 条 · 三次平均
TwoBufQueue普通 write · 首字节读回378.646354.070 – 393.53612.1172.4583.9729.0000%0 / 30,000,000
ReaderWriterQueue先清零,再完整 memcpy422.627390.659 – 440.06813.5242.6674.9039.7220%0 / 30,000,000
rigtorp/SPSCQueue成员复制+目标写预取220.680172.547 – 252.0797.0624.05614.09717.2920%0 / 30,000,000
atomic_queue完整成员复制30.20228.745 – 31.3630.96635.84769.181314.0000%0 / 30,000,000
64 B回调循环 0 次 · 每次 10,000,000 条 · 三次平均
TwoBufQueue普通 write · 首字节读回277.866250.553 – 296.09417.7833.2089.48619.8890%0 / 30,000,000
ReaderWriterQueue完整成员复制204.257142.833 – 239.65813.0724.6819.87520.3610%0 / 30,000,000
rigtorp/SPSCQueue成员复制+目标写预取99.41565.287 – 126.3906.3637.36122.86126.1940%0 / 30,000,000
atomic_queue完整成员复制45.19339.567 – 48.6902.89229.76440.02856.2220%0 / 30,000,000

表中的 p50 / p99 / p999 衡量生产者线程发送消息的耗时:先统计每组 1,000 次成功写入的平均耗时的分位数,再对三次运行取平均;并非单次调用或端到端延时。同一行所有指标来自同一配置;同一队列的四种长度也共用调优参数。综合选参是一套参数下的取舍,各单项不再声称分别最优。点击任一指标均跳到该行同一套完整参数。背压% = 背压消息条数 ÷ 总消息条数 × 100%,使用三次吞吐测量的合计数;下方同时列出分子 / 分母。每条消息即使写入失败多次,也只算一条背压消息。

三次原始结果

每项均保留三次实测,不删除慢结果;四项指标使用同一个参数编号。

8 B三次原始结果与平均值
实现 / 指标第 1 次第 2 次第 3 次平均
TwoBufQueue吞吐 M条/s · 参数 66ccd405370d488.993489.712489.940489.548
TwoBufQueuep50 ns/条 · 参数 66ccd405370d2.0002.0002.0002.000
TwoBufQueuep99 ns/条 · 参数 66ccd405370d3.6672.6672.7923.042
TwoBufQueuep999 ns/条 · 参数 66ccd405370d7.2506.2928.1677.236
ReaderWriterQueue吞吐 M条/s · 参数 05c6a693ebc0859.500649.604893.901801.002
ReaderWriterQueuep50 ns/条 · 参数 05c6a693ebc01.2081.2081.2501.222
ReaderWriterQueuep99 ns/条 · 参数 05c6a693ebc02.0421.8332.0421.972
ReaderWriterQueuep999 ns/条 · 参数 05c6a693ebc03.4172.1252.5422.694
rigtorp/SPSCQueue吞吐 M条/s · 参数 ddbed3127220331.746333.183313.386326.105
rigtorp/SPSCQueuep50 ns/条 · 参数 ddbed31272203.1252.9172.9583.000
rigtorp/SPSCQueuep99 ns/条 · 参数 ddbed31272204.5834.2084.2504.347
rigtorp/SPSCQueuep999 ns/条 · 参数 ddbed31272207.0426.5836.5006.708
atomic_queue吞吐 M条/s · 参数 f54226336788198.343175.399185.152186.298
atomic_queuep50 ns/条 · 参数 f542263367884.9175.0005.0424.986
atomic_queuep99 ns/条 · 参数 f542263367887.1678.87536.70817.583
atomic_queuep999 ns/条 · 参数 f5422633678837.50034.70837.41736.542
16 B三次原始结果与平均值
实现 / 指标第 1 次第 2 次第 3 次平均
TwoBufQueue吞吐 M条/s · 参数 c15f5c466114451.387450.415446.715449.506
TwoBufQueuep50 ns/条 · 参数 c15f5c4661142.1672.1672.1672.167
TwoBufQueuep99 ns/条 · 参数 c15f5c4661143.3333.0003.1673.167
TwoBufQueuep999 ns/条 · 参数 c15f5c4661144.3754.3334.9584.556
ReaderWriterQueue吞吐 M条/s · 参数 1fe946d9a7bc724.706800.675776.744767.375
ReaderWriterQueuep50 ns/条 · 参数 1fe946d9a7bc1.2081.5001.2501.319
ReaderWriterQueuep99 ns/条 · 参数 1fe946d9a7bc2.3752.9582.3752.569
ReaderWriterQueuep999 ns/条 · 参数 1fe946d9a7bc3.3759.5424.0425.653
rigtorp/SPSCQueue吞吐 M条/s · 参数 488489a115af304.328230.185267.931267.481
rigtorp/SPSCQueuep50 ns/条 · 参数 488489a115af3.0423.2083.0423.097
rigtorp/SPSCQueuep99 ns/条 · 参数 488489a115af5.7506.3755.4585.861
rigtorp/SPSCQueuep999 ns/条 · 参数 488489a115af9.4179.5837.5838.861
atomic_queue吞吐 M条/s · 参数 7afaa762ae1a50.12852.15743.68048.655
atomic_queuep50 ns/条 · 参数 7afaa762ae1a6.62512.62520.87513.375
atomic_queuep99 ns/条 · 参数 7afaa762ae1a38.37540.87541.00040.083
atomic_queuep999 ns/条 · 参数 7afaa762ae1a42.29243.66743.87543.278
32 B三次原始结果与平均值
实现 / 指标第 1 次第 2 次第 3 次平均
TwoBufQueue吞吐 M条/s · 参数 9ae1ffe54571354.070388.333393.536378.646
TwoBufQueuep50 ns/条 · 参数 9ae1ffe545712.4582.4582.4582.458
TwoBufQueuep99 ns/条 · 参数 9ae1ffe545714.0833.8753.9583.972
TwoBufQueuep999 ns/条 · 参数 9ae1ffe5457112.5426.0428.4179.000
ReaderWriterQueue吞吐 M条/s · 参数 37b8e391eac3437.154440.068390.659422.627
ReaderWriterQueuep50 ns/条 · 参数 37b8e391eac33.0422.9582.0002.667
ReaderWriterQueuep99 ns/条 · 参数 37b8e391eac36.1674.2084.3334.903
ReaderWriterQueuep999 ns/条 · 参数 37b8e391eac310.7509.5008.9179.722
rigtorp/SPSCQueue吞吐 M条/s · 参数 626a79b8b850237.414172.547252.079220.680
rigtorp/SPSCQueuep50 ns/条 · 参数 626a79b8b8504.0424.0424.0834.056
rigtorp/SPSCQueuep99 ns/条 · 参数 626a79b8b85013.91715.00013.37514.097
rigtorp/SPSCQueuep999 ns/条 · 参数 626a79b8b85015.83318.87517.16717.292
atomic_queue吞吐 M条/s · 参数 b998250847cc31.36328.74530.49930.202
atomic_queuep50 ns/条 · 参数 b998250847cc35.04237.00035.50035.847
atomic_queuep99 ns/条 · 参数 b998250847cc110.95841.83354.75069.181
atomic_queuep999 ns/条 · 参数 b998250847cc818.79254.00069.208314.000
64 B三次原始结果与平均值
实现 / 指标第 1 次第 2 次第 3 次平均
TwoBufQueue吞吐 M条/s · 参数 dde24d688026250.553286.951296.094277.866
TwoBufQueuep50 ns/条 · 参数 dde24d6880263.2083.1673.2503.208
TwoBufQueuep99 ns/条 · 参数 dde24d6880266.7507.45814.2509.486
TwoBufQueuep999 ns/条 · 参数 dde24d68802618.41711.04230.20819.889
ReaderWriterQueue吞吐 M条/s · 参数 8f16777e2f59142.833230.279239.658204.257
ReaderWriterQueuep50 ns/条 · 参数 8f16777e2f594.8755.0834.0834.681
ReaderWriterQueuep99 ns/条 · 参数 8f16777e2f5911.12510.7927.7089.875
ReaderWriterQueuep999 ns/条 · 参数 8f16777e2f5930.70815.33315.04220.361
rigtorp/SPSCQueue吞吐 M条/s · 参数 0d1082002fb065.287106.570126.39099.415
rigtorp/SPSCQueuep50 ns/条 · 参数 0d1082002fb07.7506.8757.4587.361
rigtorp/SPSCQueuep99 ns/条 · 参数 0d1082002fb022.95822.25023.37522.861
rigtorp/SPSCQueuep999 ns/条 · 参数 0d1082002fb026.54225.12526.91726.194
atomic_queue吞吐 M条/s · 参数 b4753ca6ef7539.56748.69047.32245.193
atomic_queuep50 ns/条 · 参数 b4753ca6ef7534.29225.37529.62529.764
atomic_queuep99 ns/条 · 参数 b4753ca6ef7541.41738.79239.87540.028
atomic_queuep999 ns/条 · 参数 b4753ca6ef7578.83344.70845.12556.222

吞吐与延时分别运行三次,运行模式和随机种子按实际记录列出。p999 每次来自约 10,000 个分组样本,尾部约 10 个,容易受调度波动影响。

全部初始化参数

按队列只列一次初始化参数,所有消息长度共用。容量条数等随长度变化的值用取值规则列出,完整运行参数保存在导出的 JSON 与原始记录中。

TwoBufQueue:所有消息长度共用的初始化参数

完整列出 61 项测试类参数及构造 / 模板参数。消息长度列为统一取值列表;容量条数和已固定的复制配置等随长度变化的值用 by_payload_bytes 对应关系表示,不重复四套参数。

测试类参数

参数取值
transporttwo_buf_queue
mode["throughput", "write_latency"]
payload_bytes[8, 16, 32, 64]
messages10000000
warmup_messages50000
callback_iterations0
verify_payloadfalse
prepared_inputtrue
variable_payloadtrue
prepared_input_limit_bytes268435456
measure_callback_timetrue
producer_interval_ns0
source_block_size1048576
source_pool_min256
source_pool_max256
source_queue_capacity512
writer_backpressuredrop
writer_spin_count1000
writer_wait_timeout_ms5000
output_block_size16777216
output_frame_capacity1024
output_pool_min16
output_pool_max16
output_queue_capacity512
cancel_claim_modetail
output_modespsc
output_reader_modewait_signal
output_reader_count1
output_retry_wait_us1000
output_enable_statsfalse
is_scan_currenttrue
reader_spin_count1000
rescan_interval_ns1000000
rescan_max_interval_ns1000000
consumer_cpu-1
producer_cpu-1
producer_qosuser_interactive
round_storage_bytes214748364
fixed_round_boundariestrue
spsc_buffer_bytes0
prefault_producer_bufferstrue
finish_timeout_ms5000
work_wait_min_ms1
finish_retry_ms1
publish_count1
use_write_sessionfalse
rigtorp_write_prefetchtrue
readerwriterqueue_copy_after_zerofalse
spsc_capacity0
retry_yield_every1024
spsc_idle_spins1000
spsc_idle_sleep_ns0
timerauto
sample_every32
max_samples1000000
latency_batch_size1000
timer_calibration_samples16384
call_batch_size256
random_seed[42, 43, 44]
timeout_seconds180
buffer_budget_bytes536870912

构造与模板参数

参数取值
source_thread_id0
read_layer1_thread_count1
writer_queue_enable_statsfalse
message_prefix_bytes0
writer_count1
source_copy_thread_count1
callback_thread_count1
pool_depth_instrumentationfalse
callback_signature(thread_id, data, payload_bytes)
callback_business_iterations0
writer_typeOwnedWriter<Writer<1, false, uint16_t, void>>
writer_apiWriter::write
ordinary_write_readbacktrue
sync_contextvoid
callback_wrapperFixedRecordCallback<PayloadBytes, Sink>
source_pool_payload_bytes268435456
reader_pool_payload_bytes268435456
ReaderWriterQueue:所有消息长度共用的初始化参数

完整列出 61 项测试类参数及构造 / 模板参数。消息长度列为统一取值列表;容量条数和已固定的复制配置等随长度变化的值用 by_payload_bytes 对应关系表示,不重复四套参数。

测试类参数

参数取值
transportreaderwriterqueue
mode["throughput", "write_latency"]
payload_bytes[8, 16, 32, 64]
messages10000000
warmup_messages50000
callback_iterations0
verify_payloadfalse
prepared_inputtrue
variable_payloadtrue
prepared_input_limit_bytes268435456
measure_callback_timetrue
producer_interval_ns0
source_block_size65536
source_pool_min4096
source_pool_max4096
source_queue_capacity4096
writer_backpressuredrop
writer_spin_count1000
writer_wait_timeout_ms5000
output_block_size1048576
output_frame_capacity1024
output_pool_min256
output_pool_max256
output_queue_capacity512
cancel_claim_modetail
output_modespsc
output_reader_modewait_signal
output_reader_count1
output_retry_wait_us1000
output_enable_statsfalse
is_scan_currentfalse
reader_spin_count1000
rescan_interval_ns1000000
rescan_max_interval_ns1000000
consumer_cpu-1
producer_cpu-1
producer_qosuser_interactive
round_storage_bytes214748364
fixed_round_boundariestrue
spsc_buffer_bytes268435456
prefault_producer_bufferstrue
finish_timeout_ms5000
work_wait_min_ms1
finish_retry_ms1
publish_count4294967295
use_write_sessionfalse
rigtorp_write_prefetchfalse
readerwriterqueue_copy_after_zero{"by_payload_bytes": {"8": false, "16": true, "32": true, "64": false}}
spsc_capacity{"by_payload_bytes": {"8": 33488385, "16": 16743937, "32": 8371713, "64": 4185601}}
retry_yield_every1024
spsc_idle_spins0
spsc_idle_sleep_ns12500
timerauto
sample_every32
max_samples1000000
latency_batch_size1000
timer_calibration_samples16384
call_batch_size256
random_seed[42, 43, 44]
timeout_seconds180
buffer_budget_bytes536870912

构造与模板参数

参数取值
source_thread_id0
read_layer1_thread_count1
writer_queue_enable_statsfalse
message_prefix_bytes0
writer_count1
source_copy_thread_count0
callback_thread_count1
pool_depth_instrumentationfalse
callback_signature(thread_id, data, payload_bytes)
callback_business_iterations0
unused_fieldssource_* / output_* / reader_spin_count / rescan_* / is_scan_current / publish_count: native SPSC does not construct TwoBufQueue layers
upstream_unmodifiedtrue
requested_native_capacity{"by_payload_bytes": {"8": 33488385, "16": 16743937, "32": 8371713, "64": 4185601}}
native_templateReaderWriterQueue<Payload,512>
copy_policy{"by_payload_bytes": {"8": "full member copy", "16": "zero initialization then full memcpy", "32": "zero initialization then full memcpy", "64": "full member copy"}}
consumer_operationpeek → callback → pop
rigtorp/SPSCQueue:所有消息长度共用的初始化参数

完整列出 61 项测试类参数及构造 / 模板参数。消息长度列为统一取值列表;容量条数和已固定的复制配置等随长度变化的值用 by_payload_bytes 对应关系表示,不重复四套参数。

测试类参数

参数取值
transportrigtorp
mode["throughput", "write_latency"]
payload_bytes[8, 16, 32, 64]
messages10000000
warmup_messages50000
callback_iterations0
verify_payloadfalse
prepared_inputtrue
variable_payloadtrue
prepared_input_limit_bytes268435456
measure_callback_timetrue
producer_interval_ns0
source_block_size65536
source_pool_min4096
source_pool_max4096
source_queue_capacity4096
writer_backpressuredrop
writer_spin_count1000
writer_wait_timeout_ms5000
output_block_size1048576
output_frame_capacity1024
output_pool_min256
output_pool_max256
output_queue_capacity512
cancel_claim_modetail
output_modespsc
output_reader_modewait_signal
output_reader_count1
output_retry_wait_us1000
output_enable_statsfalse
is_scan_currentfalse
reader_spin_count1000
rescan_interval_ns1000000
rescan_max_interval_ns1000000
consumer_cpu-1
producer_cpu-1
producer_qosuser_interactive
round_storage_bytes214748364
fixed_round_boundariestrue
spsc_buffer_bytes268435456
prefault_producer_bufferstrue
finish_timeout_ms5000
work_wait_min_ms1
finish_retry_ms1
publish_count4294967295
use_write_sessionfalse
rigtorp_write_prefetchtrue
readerwriterqueue_copy_after_zerofalse
spsc_capacity{"by_payload_bytes": {"8": 33554415, "16": 16777207, "32": 8388603, "64": 4194301}}
retry_yield_every1024
spsc_idle_spins4000
spsc_idle_sleep_ns1000
timerauto
sample_every32
max_samples1000000
latency_batch_size1000
timer_calibration_samples16384
call_batch_size256
random_seed[42, 43, 44]
timeout_seconds180
buffer_budget_bytes536870912

构造与模板参数

参数取值
source_thread_id0
read_layer1_thread_count1
writer_queue_enable_statsfalse
message_prefix_bytes0
writer_count1
source_copy_thread_count0
callback_thread_count1
pool_depth_instrumentationfalse
callback_signature(thread_id, data, payload_bytes)
callback_business_iterations0
unused_fieldssource_* / output_* / reader_spin_count / rescan_* / is_scan_current / publish_count: native SPSC does not construct TwoBufQueue layers
upstream_unmodifiedtrue
requested_native_capacity{"by_payload_bytes": {"8": 33554415, "16": 16777207, "32": 8388603, "64": 4194301}}
native_templaterigtorp::SPSCQueue<Payload>
copy_policymember initialization copy + destination write prefetch
consumer_operationfront → callback → pop
atomic_queue:所有消息长度共用的初始化参数

完整列出 61 项测试类参数及构造 / 模板参数。消息长度列为统一取值列表;容量条数和已固定的复制配置等随长度变化的值用 by_payload_bytes 对应关系表示,不重复四套参数。

测试类参数

参数取值
transportatomic_queue
mode["throughput", "write_latency"]
payload_bytes[8, 16, 32, 64]
messages10000000
warmup_messages50000
callback_iterations0
verify_payloadfalse
prepared_inputtrue
variable_payloadtrue
prepared_input_limit_bytes268435456
measure_callback_timetrue
producer_interval_ns0
source_block_size65536
source_pool_min4096
source_pool_max4096
source_queue_capacity4096
writer_backpressuredrop
writer_spin_count1000
writer_wait_timeout_ms5000
output_block_size1048576
output_frame_capacity1024
output_pool_min256
output_pool_max256
output_queue_capacity512
cancel_claim_modetail
output_modespsc
output_reader_modewait_signal
output_reader_count1
output_retry_wait_us1000
output_enable_statsfalse
is_scan_currentfalse
reader_spin_count1000
rescan_interval_ns1000000
rescan_max_interval_ns1000000
consumer_cpu-1
producer_cpu-1
producer_qosuser_interactive
round_storage_bytes214748364
fixed_round_boundariestrue
spsc_buffer_bytes268435456
prefault_producer_bufferstrue
finish_timeout_ms5000
work_wait_min_ms1
finish_retry_ms1
publish_count4294967295
use_write_sessionfalse
rigtorp_write_prefetchfalse
readerwriterqueue_copy_after_zerofalse
spsc_capacity{"by_payload_bytes": {"8": 33554432, "16": 16777216, "32": 8388608, "64": 4194304}}
retry_yield_every1024
spsc_idle_spins2000
spsc_idle_sleep_ns10000
timerauto
sample_every32
max_samples1000000
latency_batch_size1000
timer_calibration_samples16384
call_batch_size256
random_seed[42, 43, 44]
timeout_seconds180
buffer_budget_bytes536870912

构造与模板参数

参数取值
source_thread_id0
read_layer1_thread_count1
writer_queue_enable_statsfalse
message_prefix_bytes0
writer_count1
source_copy_thread_count0
callback_thread_count1
pool_depth_instrumentationfalse
callback_signature(thread_id, data, payload_bytes)
callback_business_iterations0
unused_fieldssource_* / output_* / reader_spin_count / rescan_* / is_scan_current / publish_count: native SPSC does not construct TwoBufQueue layers
upstream_unmodifiedtrue
requested_native_capacity{"by_payload_bytes": {"8": 33554432, "16": 16777216, "32": 8388608, "64": 4194304}}
native_templateAtomicQueueB2<Payload,std::allocator<Payload>,true,false,true>
copy_policyfull member copy
consumer_operationtry_pop → callback

测试方法与环境

沿用现有结果、负载、复制方式和参数选择规则。

固定的测试流程

每次 1,000 万条,预热 5 万条;业务回调循环 0;完整负载在写入计时前准备,每条的全部数据字均变化。

每轮上限固定 214,748,364 B,即第二层 256 MiB 的 80%;所有队列采用相同边界,末轮按实际条数结束。

只累计生产者写入时间。轮末交接、尾块发布与回调排空在计时外执行;全部消息仍须消费完成。TwoBufQueue 复制线程与回调线程独立运行。

普通 write 在完整写入后读回首字节;Session 不加该读回。

综合目标的平台规则

使用四种长度全部实测过的共同配置。Writer 取三个按 2 倍递增的相邻块大小;原生 SPSC 取三个相邻自旋或等待值。

三个配置的四长度综合总分差异不超过 10%;按重复编号合并的四长度综合分变异系数不超过 20%。每个长度的单项原始结果、波动和邻域变化均保存。

每个配置完整校验通过;三次吞吐与三次延时均成功,零写入失败、零 Writer 背压,延时可解析。参考值的单项变异系数上限仍为 20% / 25% / 40% / 60%。

所有指标取同一套配置;不合并遍历阶段与旧独立复测阶段的结果。这是所测共同参数范围内的最佳综合平台,不能证明全局最优。

本机与编译

macOS-14.4.1-arm64-arm-64bit · arm64 · 8 个逻辑 CPU。

Clang 18.1.8 · Release · -O3 -DNDEBUG · 无 sanitizer。

生产者 user_interactive QoS,未硬绑核;复制和回调线程不绑核。计时器:mach_absolute_time;每组 1,000 次写入。

补测使用原测量二进制,SHA-256 一致;开源头文件、完整负载与复制策略不变。补测前已确认接通电源。

数据与可复核性

原批共 1,284 次完整校验、9,708 次性能测量;失败运行 0。新增 ReaderWriterQueue 邻域:24 次完整校验、144 次性能测量;失败 0。

三份报告共享同一组原生 SPSC 对照。复制策略按表内标注固定;它与编译器生成代码也会影响结果。

旧逐项选优报告已备份。本页全部四项来自共同参数,参考值固定在补测前;详细运行配置包含 mode、random_seed 的实际值。