【问题标题】:Show Only Summary Section of BenchmarkDotNet仅显示 BenchmarkDotNet 的摘要部分
【发布时间】:2017-07-18 06:50:39
【问题描述】:

我正在对一些 .net 框架的东西进行基准测试,我正在使用 .net 框架、C# 和 BenchmarkDotNet

我想做的是;我正在编写很多基准测试,我只对报告的摘要部分感兴趣。如何将 BenchmarkDotNet 配置为仅显示测试的摘要部分?

这里有一个更清晰的截图;

【问题讨论】:

    标签: c# benchmarking benchmarkdotnet


    【解决方案1】:

    为什么要跳过日志?基准测试可能需要很长时间,如果您禁用日志,您会看到黑屏一段时间。如果出了问题,那你就不会知道了。

    但是,有一个解决方法。 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());
    

    【讨论】:

    • 嗨@AndreyAkinshin 感谢您的回答并感谢您提供的出色基准工具。我想跳过详细的日志,因为控制台应用程序窗口的文本大小有限。因此,如果开发人员编写了大量的基准测试,他/她应该离开 vs 并查看导出的摘要文件。我不想这样做,而我只对快速汇总结果感兴趣。因为我不断地更改代码。否则,详细的日志很棒。也许这样的功能会有所帮助;一个属性可能; “[DetailLevel.SummaryOnly]”或“[DetailLevel.SummaryAndSpec]”或“[DetailLevel.Full]”
    • 很高兴该库对您有用。考虑扩展控制台窗口的文本大小限制。我将添加漂亮的 API 来禁用 ConsoleLogger,并改进汇总表的打印。不要认为为日志详细信息引入一个附加属性是个好主意,因为这是一个不常见的用例。
    【解决方案2】:

    AndreyAkinshin 的回答真的很棒,但其中一部分不再有效! ManualConfig 不再提供 .GetCompositeAnalyser(),所以你必须得到 ImmutableConfig,这只能形成 BenchmarksCase

    例如,如果您只运行一个 Benchmarkcase:您可以使用 ...First() 来执行此操作

    这已经帮我解决了

    ConclusionHelper.Print(logger, summary.BenchmarksCases.**First()**.Config.GetCompositeAnalyser().Analyse(summary).ToList());
    

    【讨论】:

    • 谢谢。不幸的是,GetColumnProviders 等现在已经过时,我们应该使用AddColumnProvider 等。但是,简单的替换不起作用。有任何想法吗?非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多