如何使用 Bencher 在 CI 中跟踪基准测试
大多数基准测试结果都是短暂的。 它们在你的终端回滚到限制处时就会消失。 一些基准测试工具允许你缓存结果,但大多数只在本地这样做。 Bencher 允许你跟踪来自本地和 CI 运行的基准测试,并比较结果, 同时仍然使用你最喜欢的基准测试工具。
当在 CI 中进行持续性基准测试时,比较基准测试结果有两种流行的方法:
- 统计型持续基准测试
- 随时间跟踪基准测试结果以创建基线
- 使用这个基线以及统计阈值创建一个统计边界
- 将新结果与这个统计边界进行比较以检测性能退化
- 相对性持续基准测试
- 为当前的基线代码运行基准测试
- 使用百分比阈值为基线代码创建一个边界
- 转换到代码的新版本
- 为代码的新版本运行基准测试
- 将新版本代码的结果与基线代码的结果进行比较以检测性能退化
统计持续基准测试
接着快速开始和Docker 自托管教程,
让我们为我们的 Save Walter White
项目添加统计持续基准测试功能。
🐰 确保你已经 创建了一个 API 令牌并将其设置为
BENCHER_API_TOKEN
环境变量 再继续前行!
首先,我们需要创建一个新的 Testbed 来代表我们的 CI 运行器,适当命名为 ci-runner
。
- 使用
bencher testbed create
CLI 子命令。 更多详情参见 thetestbed create
docs。 (例如:bencher testbed create
) - 将
--name
选项设置为所需的 Testbed 名称。 (例如:--name ci-runner
) - 将项目参数指定为
Save Walter White
项目的 slug。 (例如:save-walter-white-1234abcd
)
接下来,我们需要为 ci-runner
Testbed 创建一个新的阈值:
- 使用
bencher threshold create
CLI 子命令。 更多详情参见 thethreshold create
docs。 (例如:bencher threshold create
) - 将
--branch
选项设置为默认的main
分支。 (例如:--branch main
) - 将
--branch
选项设置为新的ci-runner
Testbed。 (例如:--testbed ci-runner
) - 将
--measure
选项设置为bencher mock
生成的内置Latency
测量值。 更多详情参见 the definition of Measure。 (例如:--measure Latency
) - 将
--test
选项设置为t-test
阈值。 更多详情参见 Thresholds & Alerts。 (例如:--test t-test
) - 将
--upper-boundary
选项设置为上限值0.95
。 更多详情参见 Thresholds & Alerts。 (例如:--upper-boundary 0.95
) - 将项目参数指定为
Save Walter White
项目的 slug。 (例如:save-walter-white-1234abcd
)
现在我们已经准备好在 CI 中运行我们的基准测试了。 因为每个 CI 环境都有一点不同, 下面的示例更多的是说明性的,而不是实用性的。 更具体的示例,请参见 GitHub Actions 中的持续基准测试 和 GitLab CI/CD 中的持续基准测试。
我们需要通过在 CI 中针对每次更改进行基准测试来为我们的 main
分支创建并维护历史基准:
- 使用
bencher run
CLI 子命令 运行您的feature-branch
分支基准测试。 更多详情参见 thebencher run
CLI subcommand。 (例如:bencher run
) - 将
--project
选项设置为项目 slug。 更多详情参见 the--project
docs。 (例如:--project save-walter-white-1234abcd
) - 将
--branch
选项设置为默认的分支名称。 更多详情参见 branch selection。 (例如:--branch main
) - 将
--testbed
选项设置为 Testbed 名称。 更多详情参见 the--tested
docs。 (例如:--testbed ci-runner
) - 将
--adapter
选项设置为所需的基准测试适配器适配器。 更多详情参见 benchmark harness adapters。 (例如:--adapter json
) - 将
--err
标志设置为在生成警报时失败命令。 更多详情参见 Threshold & Alerts。 (例如:--err
) - 指定基准命令参数。
更多详情参见 benchmark command。
(例如:
bencher mock
)
最后,我们准备好在 CI 中捕获性能回归了。
这是我们如何在 CI 中跟踪一个名为 feature-branch
的新功能分支的性能:
- 使用
bencher run
CLI 子命令 运行您的feature-branch
分支基准测试。 更多详情参见 thebencher run
CLI subcommand。 (例如:bencher run
) - 将
--project
选项设置为项目 slug。 更多详情参见 the--project
docs。 (例如:--project save-walter-white-1234abcd
) - 将
--branch
选项设置为功能分支名称。 更多详情参见 branch selection。 (例如:--branch feature-branch
) - 将
--branch-start-point
选项设置为功能分支的起点。 更多详情参见 branch selection。 (例如:--branch-start-point main
) - 将
--branch-start-point-hash
选项设置为功能分支起点的git
哈希值。 更多详情参见 branch selection。 (例如:--branch-start-point-hash 32ae...dd8b
) - 将
--testbed
选项设置为 Testbed 名称。 更多详情参见 the--tested
docs。 (例如:--testbed ci-runner
) - 将
--adapter
选项设置为所需的基准测试适配器适配器。 更多详情参见 benchmark harness adapters。 (例如:--adapter json
) - 将
--err
标志设置为在生成警报时失败命令。 更多详情参见 Threshold & Alerts。 (例如:--err
) - 指定基凘命令参数。
更多详情参见 benchmark command。
(例如:
bencher mock
)
在 CI 中首次运行此命令时,
它会创建 feature-branch
分支,因为它之前不存在。
新的 feature-branch
将使用哈希值为 32aea434d751648726097ed3ac760b57107edd8b
的 main
分支作为其起点。
这意味着 feature-branch
将拥有 main
分支所有的数据和阈值来对 bencher mock
的结果进行对比,
无论是第一次还是后续运行。
相对连续基准测试
基于我们在快速开始和Docker 自托管教程中的内容,现在让我们为我们的“拯救沃尔特·怀特”项目添加相对连续基准测试。
🐰 确保你已经 创建了一个 API 令牌,并将其设置为
BENCHER_API_TOKEN
环境变量 再继续!
首先,我们需要创建一个新的 Testbed 来代表我们的 CI 运行器,恰当地命名为 ci-runner
。
- 使用
bencher testbed create
CLI 子命令。 查看 “testbed create”文档 获取更多详情。 (例如:bencher testbed create
) - 设置
--name
选项为所需的 Testbed 名称。 (例如:--name ci-runner
) - 指定项目参数为
Save Walter White
项目的 slug。 (例如:save-walter-white-1234abcd
)
相对连续基准测试通过对代码的两个版本进行并排比较。
这在处理资源在运行之间可能高度变化的嘈杂 CI/CD 环境时很有用。
在这个示例中,我们将比较在 main
分支上运行的结果与在名为 feature-branch
的特性分支上运行的结果。
因为每个CI环境都有些许不同,以下示例意在说明而非实用。
更具体的示例,参见GitHub Actions 中的连续基准测试
和GitLab CI/CD 中的连续基准测试。
首先,我们需要在 CI 中用 git
检出 main
分支:
然后我们需要在 CI 中在 main
分支上运行我们的基准测试:
- 使用
bencher run
CLI 子命令 来运行你的main
分支基准测试。 参见 “bencher run” CLI 子命令 以获得完整概览。 (例如:bencher run
) - 设置
--project
选项为项目 slug。 参见 “—project” 文档 获取更多细节。 (例如:--project save-walter-white-1234abcd
) - 设置
--branch
选项为特性分支名称。 参见 分支选择 以获得完整概览。 (例如:--branch feature-branch
) - 设置
--branch-reset
标志。 参见 分支选择 以获得完整概览。 (例如:--branch-reset
) - 设置
--testbed
选项为 Testbed 名称。 参见 “—tested” 文档 获取更多细节。 (例如:--testbed ci-runner
) - 设置
--adapter
选项为所需的基准测试适配器。 参见 基准测试适配器 以获得完整概览。 (例如:--adapter json
) - 指定基准测试命令参数。
参见 基准测试命令 以获得完整概览。
(例如:
bencher mock
)
这个命令在 CI 中首次运行时,
将会创建 feature-branch
分支,因为它还不存在。
新的 feature-branch
不会有起点、现有数据或阈值。
在后续运行中,旧的 feature-branch
将被重命名,
并创建一个没有起点、现有数据或阈值的新 feature-branch
。
接下来,我们需要在 CI 中为我们新的 feature-branch
分支创建一个新的阈值:
- 使用
bencher threshold create
CLI 子命令。 查看 “threshold create” 文档 以获得更多详情。 (例如:bencher threshold create
) - 设置
--branch
选项为新的feature-branch
分支。 (例如:--branch feature-branch
) - 将
--branch
选项设置为ci-runner
Testbed。 (例如:--testbed ci-runner
) - 设置
--measure
选项为bencher mock
生成的内置Latency
度量。 查看 度量定义 了解详情。 (例如:--measure Latency
) - 设置
--test
选项为一个percentage
阈值。 参见 阈值 & 警告 以获得完整概览。 (例如:--test t-test
) - 设置
--upper-boundary
选项为0.25
(即25%
)的上界。 参见 阈值 & 警告 以获得完整概览。 (例如:--upper-boundary 0.25
) - 指定项目参数为
Save Walter White
项目 slug。 (例如:save-walter-white-1234abcd
)
然后,我们需要在 CI 中用 git
检出 feature-branch
分支:
最后,我们准备在 CI 中运行我们的 feature-branch
基准测试:
- 使用
bencher run
CLI 子命令 来运行你的feature-branch
基准测试。 参见 “bencher run” CLI 子命令 以获得完整概览。 (例如:bencher run
) - 设置
--project
选项为项目 slug。 参见 “—project” 文档 获取更多细节。 (例如:--project save-walter-white-1234abcd
) - 设置
--branch
选项为特性分支名称。 参见 分支选择 以获得完整概览。 (例如:--branch feature-branch
) - 设置
--testbed
选项为 Testbed 名称。 参见 “—tested” 文档 获取更多细节。 (例如:--testbed ci-runner
) - 设置
--adapter
选项为所需的基准测试适配器。 参见 基准测试适配器 以获得完整概览。 (例如:--adapter json
) - 设置
--err
标志以在生成警告时失败命令。 参见 阈值 & 警告 以获得完整概览。 (例如:--err
) - 指定基准测试命令参数。
参见 基准测试命令 以获得完整概览。
(例如:
bencher mock
)
每次在 CI 中运行此命令时,
它都仅将 feature-branch
的结果与 main
的最新结果进行比较。
🐰 恭喜!您已经学会了如何使用 Bencher 在 CI 中跟踪基准测试!🎉