用途:在 CI 流水线中对 .NET 项目进行持续基准测试,检测性能回归,通过自动化阈值告警、基线跟踪与趋势报告为合并把关。
主要能力:
- 基线文件管理:用 BenchmarkDotNet 的 JSON 导出器生成机器可读结果。可通过 [JsonExporterAttribute.Full] 标注基准类,或在 ManualConfig 中 AddExporter(JsonExporter.Full) 并 WithArtifactsPath 指定输出目录。导出文件为 *-report-full.json,关键字段包括 Statistics.Mean、Median、StandardDeviation、StandardError 及 Memory.BytesAllocatedPerOperation、Gen0/1/2Collections。
- 基线存储策略:Git 提交基线文件(可版本审计、适合小型基准与稳定硬件)、GitHub Actions 制品(默认保留 90 天,适合大型基准与共享 runner)、外部存储如 S3/Azure Blob(历史无限制、可跨仓库,但需额外基础设施与凭据管理)。技能默认采用 GitHub Actions 制品策略。
- GitHub Actions 工作流:包含基础基准工作流与基线比对工作流。示例使用 actions/upload-artifact@v4 与 actions/download-artifact@v4;下载基线步骤设 continue-on-error: true 以处理首次运行无基线的情况;仅在 main 分支更新基线,用 overwrite: true 覆盖旧制品。
- 回归检测:示例脚本 scripts/compare-benchmarks.py 读取 JSON,按百分比阈值比对均值,阈值由 --threshold 指定,输出 benchmark-comparison.md 并在发现回归时以非零状态退出进而使作业失败。
- 阈值建议:专用基准硬件 5%;GitHub Actions 共享 runner 10-15%;自托管 runner 5-10%。建议在无代码变更下重复运行 5-10 次取最大方差作为噪声下限,阈值设为该下限之上(通常约 2 倍)。内存分配回归比计时更可靠,可作为硬性门槛用于零分配路径。
- 告警方式:用 actions/github-script@v7 将比对报告作为 PR 评论发布;或用比对脚本非零退出让构建失败以阻止合并。
- 趋势跟踪:可选择制品保留、benchmark-action/github-action-benchmark@v1 配合 GitHub Pages 生成趋势图,或外部时序数据库(InfluxDB、Prometheus + Grafana)实现完整可观测性栈。
- CI 优化:用 Job.ShortRun(如 WarmupCount(3)、IterationCount(5)、InvocationCount(1))缩短运行时间;通过 --filter Critical 只跑关键路径基准,用 [BenchmarkCategory] 区分 Critical 与 Extended,支持夜间全量调度(如 cron: '0 3 * * *')。
使用方式:按示配置基准类与导出器,创建 GitHub Actions 工作流运行 dotnet run -c Release --project 基准项目 -- --exporters json,上传或下载基线制品,再用比对脚本执行阈值检查并决定告警或失败。
适用场景:需要在 PR 阶段阻断性能回归、跟踪长期性能趋势的 .NET 仓库。
限制:版本假设为 BenchmarkDotNet v0.14+ 与 GitHub Actions runner 环境;共享 runner 本身存在 5-10% 噪声,阈值需自行标定;不涵盖 BenchmarkDotNet 安装与基准类设计、性能架构模式、dotnet-counters/dotnet-trace/dotnet-dump 剖析工具、OpenTelemetry 指标与分布式追踪、可组合 CI/CD 工作流设计。具体收费与价格资料暂未提供。