如何让Benchmark.NET MemoryDiagnoser输出内存诊断数据?
问题解决:Benchmark.NET 内存诊断器无输出的修复方案
你的核心问题是手动配置列时未包含内存诊断器对应的统计列——即便添加了MemoryDiagnoser,如果没指定要显示内存相关数据列,控制台输出自然不会展示内存分配、GC代等信息。以下是两种直接有效的修复方式:
方案一:在ManualConfig中显式添加内存列
既然你自定义了列集合,需要手动把内存诊断器的列加入配置:
public static void RunBenchmarks() { var config = new ManualConfig() .AddDiagnoser(new MemoryDiagnoser(new MemoryDiagnoserConfig(true))) .AddLogger(ConsoleLogger.Default) .AddColumn( TargetMethodColumn.Method, StatisticColumn.Median, StatisticColumn.StdDev, StatisticColumn.Q1, StatisticColumn.Q3, new ParamColumn("Size"), // 新增内存相关统计列 MemoryDiagnoser.Columns.Allocated, // 单次操作分配内存 MemoryDiagnoser.Columns.GcGen0, // Gen0 GC次数 MemoryDiagnoser.Columns.GcGen1, // Gen1 GC次数 MemoryDiagnoser.Columns.GcGen2, // Gen2 GC次数 MemoryDiagnoser.Columns.AllocRatio // 分配率 ); BenchmarkRunner.Run<SerialiserBenchmarks>(config); }
方案二:基于默认配置扩展(更简洁)
如果你不想手动维护所有列,可以基于Benchmark.NET的默认配置扩展,保留特性的自动生效逻辑:
public static void RunBenchmarks() { var config = ManualConfig.Create(DefaultConfig.Instance) .AddLogger(ConsoleLogger.Default) // 只添加你额外需要的列(默认配置已包含内存列) .AddColumn(StatisticColumn.Q1, StatisticColumn.Q3); BenchmarkRunner.Run<SerialiserBenchmarks>(config); }
此时类上的[MemoryDiagnoser]特性会自动生效,无需在配置中重复添加诊断器。
额外注意事项
[ShortRunJob]会减少迭代次数,可能导致内存统计数据不稳定,如需精准内存分析,建议改用[MediumRunJob]或默认Job。- 若同时在类特性和配置中添加
MemoryDiagnoser,Benchmark.NET会自动去重,不会引发冲突。
内容的提问来源于stack exchange,提问作者ekke
相关产品推荐
相关产品推荐

