5-分析流程
4 分钟阅读
译文 · 基于 Criterion.rs Documentation
分析流程
原文链接: https://bheisler.github.io/criterion.rs/book/analysis.html
本页详细介绍 Criterion.rs 使用的数据收集和分析流程。这比用户指南更深入一些;假定读者对统计概念有一定了解。特别是,读者应了解 bootstrap 采样(bootstrap sampling)的含义。
那么,话不多说,先从总体概览开始。Criterion.rs 中的每个基准测试都经历四个阶段:
- 预热(Warmup)—— 反复执行例程,以填充 CPU 和操作系统缓存,并在适用时给 JIT 时间编译代码
- 测量(Measurement)—— 反复执行例程并记录执行时间
- 分析(Analysis)—— 分析记录的样本并提炼为有意义的统计量,然后报告给用户
- 比较(Comparison)—— 将当前运行的性能与上次运行保存的数据进行比较,以确定是否发生变化,以及变化幅度
预热
流程的第一步是预热。在此阶段,反复执行例程,使操作系统、CPU 和 JIT 有时间适应新的工作负载。这有助于防止冷缓存和 JIT 编译时间等因素在后续测量中产生干扰。预热期由 Criterion 结构体中的 warm_up_time 值控制。
预热期相当简单。例程执行一次,然后两次、四次,依此类推,直到累计执行时间超过配置的预热时间。记录此期间完成的迭代次数以及经过的时间。
测量
测量阶段是 Criterion.rs 收集将在后续阶段分析和使用的性能数据的阶段。此阶段主要由 Criterion 结构体中的 measurement_time 值控制。
测量以多个样本(参见 sample_size 参数)进行。每个样本包含例程的一次或多次(通常很多次)迭代。迭代开始与结束之间的经过时间除以迭代次数,即可得到每次迭代耗时的估计值。
随着测量进行,样本的迭代次数会增加。假设第一个样本包含 10 次迭代,第二个样本将包含 20 次,第三个包含 30 次,依此类推。更形式化地说,迭代次数按如下方式计算:
iterations = [d, 2d, 3d, ... Nd]
其中 N 是样本总数,d 是一个因子,根据预热期间测得的粗略迭代时间计算得出,用于缩放迭代次数以满足配置的测量时间。请注意,d 不能小于 1,因此若迭代时间较大或配置的测量时间较短,实际测量时间可能会超过配置的测量时间。
请注意,Criterion.rs 不测量每次单独的迭代,只测量完整样本。生成的样本将保存供后续阶段使用。样本数据也会写入本地磁盘,以便在未来的基准测试运行的比较阶段使用。
分析
在此阶段,Criterion.rs 根据测量阶段收集的样本计算有用的统计量。
异常值分类
分析的第一步是异常值分类。每个样本使用 Tukey 方法的修改版本进行分类,此处简要概述。首先,根据第 25 百分位数与第 75 百分位数之差计算四分位距(IQR)。在 Tukey 方法中,小于(第 25 百分位数 - 1.5 * IQR)或大于(第 75 百分位数 + 1.5 * IQR)的值被视为异常值。Criterion.rs 在(第 25 百分位 - 3 * IQR)和(第 75 百分位 + 3 * IQR)处设置额外的围栏;超出该范围的值被视为严重异常值。
异常值分类很重要,因为用于估计平均迭代时间的分析方法对异常值敏感。因此,当 Criterion.rs 检测到异常值时,会打印警告以告知用户该基准测试可能不太可靠。此外,还会生成图表,显示哪些数据点被视为异常值、围栏位置等。
但请注意,异常值样本_不会_从数据中删除,而是与其他所有样本一起用于后续分析步骤。
线性回归
来自良好基准测试的样本在显示迭代次数与每次样本耗时的图表上应大致形成一条直线。该直线的斜率给出了每次迭代耗时的估计值。然而,单一估计值难以解释,因为它缺乏上下文。置信区间通常更有帮助。为了生成置信区间,从测量样本中生成大量 bootstrap 样本。对每个 bootstrap 样本拟合一条直线,结果是斜率的统计分布,围绕从测量样本计算出的单一估计值提供可靠的置信区间。
此重采样过程会重复进行,以生成测量迭代时间的均值、标准差、中位数和中位数绝对偏差。所有这些信息都会打印给用户,并生成图表。最后,如果存在上次运行保存的统计量,则会对两次基准测试运行进行比较。
比较
在比较阶段,根据当前基准测试运行计算出的统计量与上次运行保存的统计量进行比较,以确定在此期间性能是否发生变化,以及变化幅度。
Criterion.rs 再次基于两次运行的测量样本生成大量 bootstrap 样本。比较新旧 bootstrap 样本,并使用 T 检验计算其 T 分数。比通过比较两个测量样本计算出的 T 分数更极端的 bootstrap T 分数所占比例,给出了观察到的两组样本之间差异纯属偶然的概率。因此,若该概率非常低或为零,Criterion.rs 可以确信两次样本之间的执行时间确实存在差异。在这种情况下,会对均值和中位数差异进行 bootstrap 并打印给用户,然后整个流程对下一个基准测试重新开始。
此过程对变化可能极其敏感,尤其是与小型、高度确定性的基准测试例程结合使用时。在这些情况下,即使是极小的变化(例如后台进程负载的差异)也可能足以改变测量结果,使比较过程检测到优化或回归。由于基准测试时这类不可预测的波动通常并不值得关注,因此还有一个可配置的噪声阈值。例如,在 ±1% 范围内的优化或回归被视为噪声并被忽略。尽可能在安静的计算机上进行基准测试以尽量减少噪声,但并非总能完全消除。