bench/decimal_gda 设计

设计目标

分别测量 GDA 十进制栈每一层的开销,所用输入使所有层都必须得到相同结果,这样某一层的变化就会体现为某一个报告百分比的变化。

数学背景

对于一个数据集,令 kjk_j、cjc_j 和 fjf_j 分别为区块 jj 中 kernel、core 和 checked 路径的每次调用时间(没有 kernel 路径的情形只报告第二个量)。报告的量为

core_pct=100 med⁡j(cj−kj)med⁡jkj,full_pct=100 med⁡j(fj−cj)med⁡jcj,\text{core\_pct} = 100\,\frac{\operatorname{med}_j (c_j - k_j)}{\operatorname{med}_j k_j}, \qquad \text{full\_pct} = 100\,\frac{\operatorname{med}_j (f_j - c_j)}{\operatorname{med}_j c_j},

即某一层相对于其下一层的相对中位数配对开销。估计量、配对方式和 bootstrap 区间的推导见 bench 设计。

设计决策

工作负载

用例数据集实现协议
decimal-gda/add, sub, mul, div, fma, parse1、9、18、34、128 位数字core/gda(@decimal_gda.add 以及其他带显式 GdaContext 的函数)、full/checked(GdaDecimalChecked,它传递粘滞的上下文)Development

左操作数是长度为数据集长度的固定数字模式,右操作数为 2,加数为 3;对于 dd 位数字,上下文精度为 max⁡(9,2d+4)\max(9, 2d + 4),指数界限为 ±999999\pm 999999,因此没有任何操作会舍入或触发陷阱。parse 读取模式文本。

正确性预言

输出以结构相等与 core 结果核对,因此 checked 路径必须返回完全相同的十进制数,包括指数。与预言不符的输出计为失败,且性能测试断言不存在失败,因此比较永远不会发生在计算不同结果的路径之间。

精确输入

精确结果使各路径的算术工作完全相同:没有哪条路径能靠更早舍入而胜出,测得的差异即表示、上下文处理和检查的开销。

正确性 / 不变式

  • 计划测试在普通测试运行中编译每个规格,因此基准不会在无人察觉的情况下失效。
  • 性能测试断言 failed_count == 0:每个输出都与其预言一致。
  • 种子是固定的(20260715),因此测量顺序和 bootstrap 重抽样都可复现。

被否决的替代方案

  • 每个样本使用随机输入。 这会把输入方差混入计时方差;每个数据集使用固定模式可以隔离代码本身的开销。
  • 只做端到端计时。 单个数字无法分辨回归发生在 kernel、core 还是 checked 包装层。

边界

  • 仅限 native 目标;不对其他目标作任何结论。
  • 没有公共 API;该包为 tools/benchmark.py 而存在。
  • 测量结果是性能页面的证据,绝不是正确性的证据。