> 同一台机器上 6/9 个指标是双峰的——进程启动时二选一,然后整轮不变
为了估计"两次运行之间的正常波动",跑了 40 次基准。结果不是一个带噪声的水平,是两个水平:
结论先行¶
为了估计"两次运行之间的正常波动",跑了 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 之前:
- 先跑一个长基准序列,画直方图,不要只看均值和标准差。 一个 40 次的序列足够看出模态;一个 5 次的序列只会给你一个可信的错误分散度。
- 双峰的指标要显式排除并报出来,不要让它们挂在一个无意义的效应量门禁下
(那等于永不触发,见 测不出失败的门禁比没有门禁更糟——它在制造信心)。
工具应该有
--list之类的方式告诉你哪些指标被排除了。 - 分散度必须来自序列本身,不是来自单次运行内部的重复测量—— 这个项目两个都算并打印比值,让差距被报告而不是被假设。
- 换硬件就等于换了基准。 把基准序列当数据管理,不当输出管理。 见 被引用的产物要有一个"任何一次运行都生成不出来"的文件名。
寻找模态的实现方式有个陷阱,它会把你的回退当成模态——见 排序后聚类去找"两个模态",会把一次回退当成模态然后放行。
出处¶
~/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 双峰)