> 同一台机器上 6/9 个指标是双峰的——进程启动时二选一,然后整轮不变

Systems & Infrastructure Advanced 2026-10-11 18:09 2026-10-11
#benchmarking #performance #statistics #gates #measurement #reproducibility

为了估计"两次运行之间的正常波动",跑了 40 次基准。结果不是一个带噪声的水平,是两个水平:

// TABLE_OF_CONTENTS

结论先行

为了估计"两次运行之间的正常波动",跑了 40 次基准。结果不是一个带噪声的水平,是两个水平:

1.4832  1.4883  1.4947  1.1345  1.0199  1.0183  1.0540  1.4737  1.4908 ...

SPSCQueue::try_push 只取 ~1.02 ns 或 ~1.48 ns 之一,相距 45.8%, 在进程启动时选定,整轮运行稳定不变。九个被测指标里有六个这样:

指标 快 慢 差距 分离度 慢模态占比
SPSCQueue::try_push 1.017 1.483 45.8% 19.9 sd 48%
SPSCQueue::try_pop 0.768 0.939 22.3% 19.6 sd 38%
ObjectPool::deallocate 1.059 1.267 19.7% 12.5 sd 28%
operator new/delete 11.451 13.433 17.3% 12.9 sd 22%
EventBus::publish (preset) 38.093 42.107 10.5% 8.5 sd 25%
EventBus::publish (auto) 58.625 63.570 8.4% 9.1 sd 20%

8.5 到 19.9 个稳健标准差的分离——这是模态,不是阈值放宽。

为什么

双峰对两种门禁的影响方向相反,这是关键:

水平检验活下来了。 模态是随机交替的,所以没有哪一段系统性地不同, E-Divisive 正确地什么都没找到。反过来,一个百分比阈值会在几乎每轮都触发。

效应量门禁活不下来。 在一个双峰序列上算出来的分散度既不描述快模态也不描述慢模态, 于是模态配比上的一点运气就会读成一次大幅位移。这个项目的处理是: 检测到双峰就报出数字,并把这些指标从裁决中排除,而不是拿一个名不副实的统计量去判它们。

副产物是给 README 的数字划了一条下限。它原来写的是"应该在别处复现的是量级和次序, 不是第三位有效数字"。在这台机器上第二位也不可复现——而现在这是测出来的,不是对冲出来的。

嫌疑名单(ASLR 下的代码与数据对齐、page colouring、pin 到哪个物理核相对于 CCX) 对一个进程是固定的、在进程之间变化,正好符合观察到的形态。但项目明确写着: 双峰只是被测量了,没有被解释。

怎么用

在把任何"性能回退门禁"接进 CI 之前:

  1. 先跑一个长基准序列,画直方图,不要只看均值和标准差。 一个 40 次的序列足够看出模态;一个 5 次的序列只会给你一个可信的错误分散度。
  2. 双峰的指标要显式排除并报出来,不要让它们挂在一个无意义的效应量门禁下 (那等于永不触发,见 测不出失败的门禁比没有门禁更糟——它在制造信心)。 工具应该有 --list 之类的方式告诉你哪些指标被排除了。
  3. 分散度必须来自序列本身,不是来自单次运行内部的重复测量—— 这个项目两个都算并打印比值,让差距被报告而不是被假设。
  4. 换硬件就等于换了基准。 把基准序列当数据管理,不当输出管理。 见 被引用的产物要有一个"任何一次运行都生成不出来"的文件名。

寻找模态的实现方式有个陷阱,它会把你的回退当成模态——见 排序后聚类去找"两个模态",会把一次回退当成模态然后放行。

出处

  • ~/Engineering/High-Performance-Hybrid-Trading-System/docs/REGRESSION.md "Then the hardware turned out to be bimodal" 一节(含上表与那串原始观测值)、 "Two bars, and why the second one exists"、以及末尾"开放问题"里 "双峰未被解释,只被测量"与"六个指标被 ungated"
  • 实现:同项目 src/tools/regression_main.cpp(m.gate.ungated → 标为 "bimodal", 并打印支撑这个判断的数字——"A label alone would…")
  • 同项目 README.md 第 104 行与第 244 行(九个指标里六个 across processes 双峰)