You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为BenchmarkDotNet汇总信息添加额外内容(如主机名、Git分支名)?

如何给BenchmarkDotNet的汇总信息添加自定义内容(主机名、Git分支等)

要给BenchmarkDotNet生成的汇总信息添加主机名、Git分支这类自定义内容,其实有两种比较实用的方式,我来给你详细拆解下:

方式一:自定义配置类,修改Summary Header(推荐)

这种方式直接修改BenchmarkDotNet生成的Summary对象,把自定义信息整合到官方的汇总Header里,格式最贴合你想要的效果。

实现步骤:

  1. 创建一个继承自ManualConfig的自定义配置类
  2. 重写GetSummary方法,在里面获取主机名、Git分支等信息
  3. 将自定义信息插入到Summary的Header列表中
  4. 运行基准测试时指定这个自定义配置

代码示例:

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

MethodMeanError
Foo1,940.3 msNA

注意事项

  • 如果使用LibGit2Sharp,要确保你的代码能访问到Git仓库的根目录,若当前目录不是仓库根,可在Repository构造函数中指定完整路径。
  • 命令行方式获取Git分支需要系统已安装Git,且git命令能在环境变量中找到。
  • 你还可以用类似的方法添加其他自定义信息,比如当前时间、环境变量值等。

内容的提问来源于stack exchange,提问作者ViktorZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:29:07