如何在BenchmarkDotNet导出的HTML或 CSV文件名中添加时间戳(日期)?
我在一个.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,例如 - XML 和 Json 一种:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

