如何为BenchmarkDotNet汇总信息添加额外内容(如主机名、Git分支名)?
如何给BenchmarkDotNet的汇总信息添加自定义内容(主机名、Git分支等)
要给BenchmarkDotNet生成的汇总信息添加主机名、Git分支这类自定义内容,其实有两种比较实用的方式,我来给你详细拆解下:
方式一:自定义配置类,修改Summary Header(推荐)
这种方式直接修改BenchmarkDotNet生成的Summary对象,把自定义信息整合到官方的汇总Header里,格式最贴合你想要的效果。
实现步骤:
- 创建一个继承自
ManualConfig的自定义配置类 - 重写
GetSummary方法,在里面获取主机名、Git分支等信息 - 将自定义信息插入到Summary的Header列表中
- 运行基准测试时指定这个自定义配置
代码示例:
using BenchmarkDotNet.Configs; using BenchmarkDotNet.Reports; using BenchmarkDotNet.Running; using LibGit2Sharp; // 需要安装LibGit2Sharp NuGet包来读取Git分支 using System; public class CustomBenchmarkConfig : ManualConfig { public CustomBenchmarkConfig() { // 先添加BenchmarkDotNet的默认配置,保留原有功能 AddDefaultConfig(); } public override Summary GetSummary(Summary summary) { // 获取当前主机名 var machineName = Environment.MachineName; // 获取当前Git分支 string branchName; try { // 假设当前目录是Git仓库根目录,若不是可指定仓库路径 using var repo = new Repository(Environment.CurrentDirectory); branchName = repo.Head.FriendlyName; } catch { // 捕获异常,避免因Git环境问题导致基准测试失败 branchName = "Unknown Branch"; } // 将自定义信息插入到汇总Header的最前面 summary.Header.Insert(0, $"Host MachineName: {machineName}"); summary.Header.Insert(1, $"Branch: {branchName}"); return base.GetSummary(summary); } } // 运行基准测试时使用自定义配置 BenchmarkRunner.Run<YourBenchmarkClass>(new CustomBenchmarkConfig());
方式二:自定义Logger,拦截日志输出
如果你不想修改Summary对象,也可以通过自定义Logger在BenchmarkDotNet输出汇总信息前,先打印出自定义内容。这种方式更轻量,还能避免依赖额外的NuGet包(比如获取Git分支可以用命令行)。
代码示例:
using BenchmarkDotNet.Loggers; using BenchmarkDotNet.Configs; using System; using System.Diagnostics; public class CustomConsoleLogger : ConsoleLogger { public override void Write(LogKind logKind, string text) { // 拦截BenchmarkDotNet的标准Header输出,在它之前插入自定义信息 if (logKind == LogKind.Header && text.StartsWith("BenchmarkDotNet=")) { // 输出主机名 base.Write(LogKind.Header, $"Host MachineName: {Environment.MachineName}\n"); // 用命令行方式获取Git分支,无需依赖LibGit2Sharp base.Write(LogKind.Header, $"Branch: {GetGitBranchViaCommandLine()}\n"); } // 继续输出原有内容 base.Write(logKind, text); } private string GetGitBranchViaCommandLine() { try { var process = new Process { StartInfo = new ProcessStartInfo { FileName = "git", Arguments = "rev-parse --abbrev-ref HEAD", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true } }; process.Start(); string branch = process.StandardOutput.ReadToEnd().Trim(); process.WaitForExit(); return string.IsNullOrEmpty(branch) ? "Unknown Branch" : branch; } catch { return "Unknown Branch"; } } } // 配置中使用自定义Logger public class CustomLoggerConfig : ManualConfig { public CustomLoggerConfig() { AddLogger(new CustomConsoleLogger()); AddDefaultConfig(); } }
效果展示
无论用哪种方式,最终你都会得到类似这样的汇总输出:
Host MachineName: DESKTOP-XYZ789
Branch: feature/optimize-benchmarks
BenchmarkDotNet=v0.13.1, OS=Windows 10... Intel Core i7...
[Host] : .NET Framework 4.8 (4.8.4300.0), X64 RyuJIT
Dry : .NET Framework 4.8 (4.8.4300.0), X64 RyuJIT
Job=Dry IterationCount=1 LaunchCount=1 RunStrategy=ColdStart UnrollFactor=1 WarmupCount=1
Method Mean Error Foo 1,940.3 ms NA
注意事项
- 如果使用LibGit2Sharp,要确保你的代码能访问到Git仓库的根目录,若当前目录不是仓库根,可在
Repository构造函数中指定完整路径。 - 命令行方式获取Git分支需要系统已安装Git,且
git命令能在环境变量中找到。 - 你还可以用类似的方法添加其他自定义信息,比如当前时间、环境变量值等。
内容的提问来源于stack exchange,提问作者ViktorZ
相关产品推荐
相关产品推荐

