如何为BenchmarkDotNet导出的HTML/CSV文件名添加时间戳
在BenchmarkDotNet中为导出文件添加时间戳避免覆盖
要解决默认导出器覆盖历史结果的问题,你可以通过自定义导出器扩展默认的Html和Csv导出器,在生成文件名时自动添加时间戳。以下是具体实现步骤:
1. 自定义带时间戳的导出器
创建两个自定义导出器类,分别继承自默认的HtmlExporter和CsvExporter,重写GetFilename方法注入时间戳:
using BenchmarkDotNet.Exporters; using BenchmarkDotNet.Reports; using System; public class TimestampedHtmlExporter : HtmlExporter { public new static readonly TimestampedHtmlExporter Default = new(); protected override string GetFilename(Summary summary) { var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); return $"Benchmark_{timestamp}.html"; } } public class TimestampedCsvExporter : CsvExporter { public new static readonly TimestampedCsvExporter Default = new(); protected override string GetFilename(Summary summary) { var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); return $"Benchmark_{timestamp}.csv"; } }
2. 修改Benchmark配置
将原配置中的默认导出器替换为自定义的带时间戳导出器,其余配置保持不变:
AddColumnProvider(DefaultColumnProviders.Instance); var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); culture.NumberFormat.NumberDecimalSeparator = ","; culture.NumberFormat.NumberGroupSeparator = ""; // 替换为自定义的带时间戳导出器 AddExporter(TimestampedHtmlExporter.Default); AddExporter(TimestampedCsvExporter.Default); WithSummaryStyle( new SummaryStyle( cultureInfo: culture, printUnitsInHeader: true, printUnitsInContent: false, timeUnit: Perfolizer.Horology.TimeUnit.Nanosecond, sizeUnit: null ) ); WithOptions(ConfigOptions.JoinSummary);
关键说明
- 时间戳格式可按需调整,比如
yyyy-MM-dd_HH-mm-ss,只需修改ToString方法中的格式字符串即可。 - 自定义导出器完全继承默认导出器的所有功能,仅修改文件名生成逻辑,不会影响导出内容的格式与结构。
- 若需更灵活的命名(如包含基准测试类名),可在
GetFilename方法中利用summary对象的属性(如summary.Title)拼接文件名。
内容的提问来源于stack exchange,提问作者Wado
相关产品推荐
相关产品推荐

