仅显示BenchmarkDotNet的摘要部分

13

我正在对一些 .net framework 技术进行基准测试,使用的是 .net framework、C# 和 BenchmarkDotNet

我的目标是编写大量基准测试,并仅对报告的摘要部分感兴趣。如何配置 BenchmarkDotNet 仅显示测试的摘要部分?

这里有一张截图,以便更加清楚;

enter image description here

2个回答

4
为什么要跳过日志?如果禁用日志,基准测试可能需要很长时间,您将在黑屏上看一段时间。如果出现问题,您将不会知道它。
但是,有一个解决方法。BenchmarkDotNet使用特殊的Configs进行自定义。Loggers是这些配置的一部分。如果您没有指定任何配置文件,则默认配置文件将使用它。您可以轻松扩展它,但是没有很好的API来禁用默认配置的一部分(希望很快添加;相应的API正在讨论阶段)。因此,您必须定义自己的配置文件,添加除记录器以外的所有默认配置部分,并将其传递给BenchmarkRunner。然后,ConsoleLogger将不会被使用。之后,您必须手动将摘要表和结论打印到控制台。此外,完整的日志和Markdown格式的摘要表将位于BenchmarkDotNet.Artifacts文件夹中。
源代码:
var config = new ManualConfig();
config.Add(DefaultConfig.Instance.GetColumnProviders().ToArray());
config.Add(DefaultConfig.Instance.GetExporters().ToArray());
config.Add(DefaultConfig.Instance.GetDiagnosers().ToArray());
config.Add(DefaultConfig.Instance.GetAnalysers().ToArray());
config.Add(DefaultConfig.Instance.GetJobs().ToArray());
config.Add(DefaultConfig.Instance.GetValidators().ToArray());
config.UnionRule = ConfigUnionRule.AlwaysUseGlobal; // Overriding the default

var summary = BenchmarkRunner.Run<TestBench>(config);

var logger = ConsoleLogger.Default;
MarkdownExporter.Console.ExportToLog(summary, logger);
ConclusionHelper.Print(logger, config.GetCompositeAnalyser().Analyse(summary).ToList());

2
嗨@AndreyAkinshin,感谢您的回答和感谢您提供的出色基准测试工具。我想跳过详细日志,因为控制台应用程序窗口的文本大小受限。因此,如果开发人员编写了许多基准测试,则应离开vs并查看导出的摘要文件。当我只对摘要结果感兴趣时,我不想这样做,因为我正在不断更改代码。否则,详细日志非常棒。也许像这样的功能将会很有帮助; 一个属性可能是;“[DetailLevel.SummaryOnly]”或“[DetailLevel.SummaryAndSpec]”或“[DetailLevel.Full]” - Lost_In_Library
很高兴这个库对你有用。考虑扩大控制台窗口的文本大小限制。我将添加一个不错的API来禁用ConsoleLogger并改进摘要表的打印。不要认为引入额外的日志详细信息属性是一个好主意,因为这是一个不常见的用例。 - AndreyAkinshin
1
只是想提一下,我一直在寻找尝试做同样的事情,我只想在列表中显示每个摘要表(而不是连接为一个整体),但每个方法似乎都会导致某些东西不再按照提供的示例所示的方式运行。如果文档中可以展示运行多个测试并仅转储摘要的简单示例,即使只是在控制台中,也将非常好,以便在您不关心工件的情况下,可以更快地迭代和快速反馈,您只需要更改一些内容并查看它是否朝着正确的方向迈出了一步。 - Grofit
嘿,上面的代码不再起作用了 @AndreyAkinshin - undefined
嘿,上面的代码不再起作用了 @AndreyAkinshin - undefined

3
安德列·阿金辛的回答非常好,但其中一部分已经不再有效了!ManualConfig不再提供.GetCompositeAnalyser(),因此您必须获取ImmutableConfig,并且只能从BenchmarksCase中实现这一点。
例如,如果您只运行一个Benchmarkcase:您可以使用...First()来完成此操作。
这为我解决了问题。
ConclusionHelper.Print(logger, summary.BenchmarksCases.**First()**.Config.GetCompositeAnalyser().Analyse(summary).ToList());

谢谢。不幸的是,GetColumnProviders等已经过时,我们应该使用AddColumnProvider等函数。然而,简单的替换并不起作用。有什么想法吗?非常感谢。 - user1908746

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接