码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基准测试工具 --- BenchmarkDotNet


    合集 - 小工具(8)
    1.Net 编译器平台 --- Roslyn07-072.Net 编译器平台--- Roslyn Scripting APIs 07-083.UI自动化 --- 微软UI Automation07-094.UI自动化 --- UI Automation 基础详解07-105.工具 --- IL指令集解释07-21
    6.基准测试工具 --- BenchmarkDotNet07-21
    7.小工具 --- 百度翻译API翻译工具08-138.小工具 --- 树形展示多属性复杂结构类08-13
    收起

    介绍

    今天介绍一个非常强大的基于.Net 的基准测试工具BenchmarkDotNet。

    BenchmarkDotNet 已经被14300多个项目采用,包括非常多的知名开源项目,例如

    • dotnet/performance(.Net所有运行时的基准测试项目)
    • dotnet/runtime(.Net 运行时库),
    • Roslyn (c#和Visual Basic编译器),
    • Mono、 ASP.NET Core、 ML.NET、 Entity Framework Core、 PowerShell SignalR、 f#、 Orleans, Newtonsoft.Json、Elasticsearch.Net、Dapper等诸多知名开源项目。

    BenchmarkDotNet能够自动在所有运行时运行基准,汇总测试结果,并打印一个汇总表,其中包含众多基准信息:

    image.png

    这些测试数据也可以导出为不同的格式(md, html, csv, xml, json等),包括图片:

    image.png

    最主要的是它可以非常容易的编写基准测试,只需要安装好NuGet包之后,给需要测试的方法标注 Attribute,就可以执行测试。

    Demo

    这里可以使用控制台或单元测试来进行测试。

    官方GitHub上分别提供了基于控制台和基于XUnit单元测试的基准测试:

    • 基于控制台Demo(https://github.com/dotnet/BenchmarkDotNet/tree/master/samples/BenchmarkDotNet.Samples)
    • 基于Xunit单元测试Demo(https://github.com/dotnet/BenchmarkDotNet/tree/master/tests/BenchmarkDotNet.IntegrationTests)

    接下来,以一个基于控制台的基准测试来讲解一下:

    class Program
    {
        static void Main(string[] args)
        {
            BenchmarkRunner.Run();
        }
    }
    
    [SimpleJob(RunStrategy.ColdStart, iterationCount: 100000)]
    public class BenchmarkTest
    {
        [Benchmark()]
        public void CreateTuple()
        {
            var temp = new Tuple<int, string>(1, "");
        }
    }
    

    上述代码中,创建了一个 BenchmarkTest 类用于做基准测试,然后创建了一个 CreateTuple()方法,该方法创建一个 Tuple 对象,然后我们给这个方法标记 [Benchmark()] ,标记该方法用于做基准测试,然后在BenchmarkTest 类上标记 [SimpleJob(RunStrategy.ColdStart, iterationCount: 100000)],表示是以冷启动的方式,执行该类要测试的基准方法100000次。

    接下来,来看一下测试结果,输出:

    image.png

    讲解

    可以看到控制台输出分为了几个部分。

    Summary

    可以看到控制台输出中黄色部分加下方表格,就是该报告主要内容,能看到当前执行测试时的运行环境,测试条件(IterationCount=100000 RunStrategy=ColdStart),表格中也能看到具体性能,比如,

    1. Method(测试方法的名称为CreateTuple)。
    2. Mean(测试运行的平均时间为420.7纳秒)。
    3. Error(测试运行的标准误差为16.96纳秒)。
    4. StdDev(所有测试运行的标准偏差为1630纳秒)。
    5. Median(所有测试运行的中位数为300纳秒)。

    Legends

    简单描述了表格中的一些参数。

    实际上在 BenchmarkDotNet 中,这样的统计数据列大概有90多条,可以参考这里(https://github.com/dotnet/BenchmarkDotNet/blob/master/src/BenchmarkDotNet/Columns/Column.cs)

    下面挑出一些常用统计列,简单解释:

    • Method: 测试方法的名称。
    • Mean: 所有测试运行的平均时间。
    • Error: 测试运行的标准误差,标准误差是测试结果的离散程度的度量,标准误差越小,表示测试结果越稳定。
    • StdDev: 所有测试运行的标准偏差,标准偏差是测试结果的离散程度的度量,标准偏差越小,表示测试结果越接近平均值。
    • Median: 所有测试运行的中位数。中位数是测试结果的中间值,如果测试结果的个数为奇数,则中位数为中间的那个值;如果测试结果的个数为偶数,则中位数为中间两个值的平均值。
    • Ratio: 每个测试运行的平均时间与基准测试运行的平均时间的比值。基准测试是性能最好的测试,它的比值为 1.0。其他测试的比值表示它们相对于基准测试的性能表现,比值越小,表示性能越好。
    • RatioSD: 所有测试运行的比值的标准偏差。标准偏差越小,表示比值的离散程度越小,测试结果更稳定。
    • Gen 0: 所有测试运行期间生成的第 0 代垃圾回收的次数。垃圾回收是 .NET 运行时自动回收不再使用的内存的机制,Generational Garbage Collection 是 .NET 中的一种垃圾回收算法。
    • Gen 1: 所有测试运行期间生成的第 1 代垃圾回收的次数。
    • Gen 2: 所有测试运行期间生成的第 2 代垃圾回收的次数。
    • Allocated: 所有测试运行期间分配的内存总量。

    Warings

    会给出一些警告,或者建议操作,像示例代码中生成100000个 Tuple 对象,他就报警方法执行实现太短,建议使用更多操作将其增加到至少100.0000 ms。

    Export

    上面其实还有一部分控制台内容是 Export 内容 ,如下图所示:

    image.png

    默认给你生成了三种格式的报告,CSV格式,Markdownn格式,和Html格式,生成路径是运行根目录下的BenchmarkDotNet.Artifacts\results\文件夹下的 BenchmarkDotNet.Console.BenchmarkTest-report文件。

    image.png

    总结

    本篇抛砖引玉,只讲述基于控制台做基准测试,强烈建议各位看官阅读Github上的示例,学会使用更多的参数,借助 BenchmarkDotNet 做出更准确准确、更可靠的性能测试结果。

    参考

    BenchmarkDotNet Github地址:https://github.com/dotnet/BenchmarkDotNet

    基于控制台Demo Github地址:https://github.com/dotnet/BenchmarkDotNet/tree/master/samples/BenchmarkDotNet.Samples

    基于Xunit单元测试Demo Github地址:https://github.com/dotnet/BenchmarkDotNet/tree/master/tests/BenchmarkDotNet.IntegrationTests

    统计数据列参考 Githu地址:https://github.com/dotnet/BenchmarkDotNet/blob/master/src/BenchmarkDotNet/Columns/Column.cs

  • 相关阅读:
    pytorch 33 使用mmdeploy将mmdetection模型转换为onnx,并实现c++部署(支持动态nms)
    vue2入门--->非单文件组件(html直接使用组件)
    同花顺后端工程师一面面试经验
    通关GO语言20 协作开发:模块化管理为什么能够提升研发效能?
    练习作业P1
    flutter面试题
    who命令
    CSS样式中颜色与颜色值的应用
    智慧学习环境移动智能终端零信任安全机制改进方案
    vr虚拟现实技术融入司法办案实操培训中的优势
  • 原文地址:https://www.cnblogs.com/pandefu/p/17536270.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号