如何在BenchmarkDotNet导出的HTML或 CSV文件名中添加时间戳(日期)?

前端开发 2026-07-09

我在一个.NET应用中使用BenchmarkDotNet进行性能基准测试,并使用内置导出器将结果导出为HTML和 CSV。

下面是我的配置的一部分:

        AddColumnProvider(DefaultColumnProviders.Instance);
        var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
        culture.NumberFormat.NumberDecimalSeparator = ",";
        culture.NumberFormat.NumberGroupSeparator = "";

        AddExporter(HtmlExporter.Default);


        AddExporter(CsvExporter.Default);

        WithSummaryStyle(
            new SummaryStyle(
                cultureInfo: culture,
                printUnitsInHeader: true,
                printUnitsInContent: false,
                timeUnit: Perfolizer.Horology.TimeUnit.Nanosecond,
                sizeUnit: null
            )
        );


        WithOptions(ConfigOptions.JoinSummary);

问题在于BenchmarkDotNet生成的输出文件名是固定的,每次新的运行都会覆盖之前的结果。
我想在导出的文件名中加入时间戳(日期和时间),例如:Benchmark_20260515_120000.html,这样就能保留基准测试运行的历史记录。
我看到过关于避免覆盖结果的讨论(例如问题#1074),但在使用默认导出器时,还没有找到一种简单的方法能够自动在文件名中加入时间戳。

解决方案

有一个选项可以实现这个(配置选项 文档):

ConfigOptions.DontOverwriteResults - 导出的结果文件不应被覆盖(默认情况下会被覆盖)。

所以尝试添加:

WithOptions(ConfigOptions.DontOverwriteResults);

在此输入图片描述

或者你可以使用 fileNameSuffix

一些标准导出器已经允许传递 fileNameSuffix,例如 - XMLJson 一种:

AddExporter(JsonExporter.Custom("_customFileNameSuffix", indentJson: true, excludeMeasurements: true));

对于其他导出器,后缀属性未暴露,但你可以通过继承并重写后缀来实现:

public class MyHtmlExporter : HtmlExporter
{
    public MyHtmlExporter()
    {
        FileNameSuffix = $"_gurustron_{DateTime.UtcNow.Ticks}";
    }

    protected override string FileNameSuffix { get; }
}
AddExporter(new MyHtmlExporter());

在此输入图片描述

同样也可以对csv这样做:

public class MyCsvExporter : CsvExporter
{
    public MyCsvExporter() : base(CsvSeparator.CurrentCulture) // mimic the Default behavior
    {
        FileNameSuffix = $"_gurustron_{DateTime.UtcNow.Ticks}";
    }

    protected override string FileNameSuffix { get; }
}

有一个发现是,并非所有后缀都真的能工作,例如 DateTime.UtcNow.ToLongTimeString()(不是 DateTime.UtcNow.Ticks)对我来说就不起作用。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章