BenchmarkDotNet 概述


BenchmarkDotNet helps you to transform methods into benchmarks, track their performance, and share reproducible measurement experiments. It's no harder than writing unit tests

提取几个关键字(其实是只认识那几个英文单词)

  • 将方法转换基准测试
  • 跟踪性能
  • 可重复实验
  • 不必单元测试难

说白了,就是代码的性能测试,通常是用来比较两段代码/方法,或者在不同平台上的执行效果。

BenchmarkDotNet 快速入门


  1. 添加包
  1. dotnet add package BenchmarkDotNet
  1. 添加需要基准测试的方法(这里我准备两个排序算法,快速排序 && 堆排序)
  1. [Benchmark]
  2. [Arguments(new int[] { 3, 1, 10, 9, 6, 2, 5, 7, 8, 4 })]
  3. public void QuickSort(int[] nums) => Demo.BenchmarkDotNet.QuickSort.Sort(nums);
  4. [Benchmark]
  5. [Arguments(new int[] { 3, 1, 10, 9, 6, 2, 5, 7, 8, 4 })]
  6. public void HeapSort(int[] nums) => Demo.BenchmarkDotNet.HeapSort.Sort(nums);
  1. Main里执行BenchmarkRunner.Run
  1. var summary = BenchmarkRunner.Run<QuickSortVsHeapSort>();
  1. 执行(需要Release模式)
  1. dotnet run -c=Release
  1. 分析结果
  1. BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18363.778 (1909/November2018Update/19H2)
  2. Intel Core i7-10510U CPU 1.80GHz, 1 CPU, 8 logical and 4 physical cores
  3. .NET Core SDK=3.1.202
  4. [Host] : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
  5. DefaultJob : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
  6. | Method | nums | Mean | Error | StdDev |
  7. |---------- |---------- |---------:|---------:|---------:|
  8. | QuickSort | Int32[10] | 61.98 ns | 0.242 ns | 0.202 ns |
  9. | HeapSort | Int32[10] | 89.19 ns | 0.374 ns | 0.332 ns |

除了控制台,还可以在BenchmarkDotNet.Artifacts/result找到多种格式的输出结果

可以看到QuickSort ,HeapSort比较接近,但是我们测试的数据量太少,所以这个没代表性

  1. 总结

可以看到BenchmarkDotNet对原来的代码是没有侵入式,通常我是新建一个测试类,然后再测试类初始化测试参数,这样对原来代码没有侵入

进阶用法

多组输入参数

  1. [Benchmark]
  2. [ArgumentsSource(nameof(Data))]
  3. public void QuickSort(int[] nums) => Demo.BenchmarkDotNet.QuickSort.Sort(nums);
  4. public IEnumerable<int[]> Data()
  5. {
  6. var random = new Random();
  7. var datas = Enumerable.Range(1, 10000).ToArray();
  8. // 打乱数组
  9. for (int i = datas.Length - 1; i > 0; i--)
  10. {
  11. var value = datas[i];
  12. var randomIndex = random.Next(0, i);
  13. datas[i] = datas[randomIndex];
  14. datas[randomIndex] = value;
  15. }
  16. yield return datas.Take(100).ToArray();
  17. yield return datas.Take(1000).ToArray();
  18. yield return datas;
  19. }

ArgumentsSource : 参数可以是方法/属性的名称

多平台比较

  1. 在基准测试类中添加SimpleJob
  1. [SimpleJob(RuntimeMoniker.NetCoreApp31)]
  2. [SimpleJob(RuntimeMoniker.Net472)]
  3. public class QuickSortVsHeapSort
  4. {
  5. }
  1. 项目方案添加多个运行时
  1. <TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>

添加统计字段

在基准测试类添加MaxColumn , MinColumn,MemoryDiagnoser

  1. [MaxColumn, MinColumn, MemoryDiagnoser]
  2. public class QuickSortVsHeapSort
  3. {
  4. ...
  5. }

添加基准

比较快速排序和堆排序,可以用其中一个作为基准,也可以新增一个作为基准作为参考。例如这里选择以冒泡排序作为基准 ,下图是各个排序算法的时间复杂度

排序 平均情况 最坏情况 最好情况 空间复杂度
冒泡排序 O(\(n^2\)) O(\(n^2\)) O(\(n^2\)) O(1)
快速排序 O(n\(\log_2n\)) O(\(n^2\)) O(n\(\log_2n\)) O(n\(\log_2n\))
堆排序 O(n\(\log_2n\)) O(n\(\log_2n\)) O(n\(\log_2n\)) O(1)
  1. [Benchmark(Baseline = true)]
  2. [ArgumentsSource(nameof(Data))]
  3. public void BubbleSort(int[] nums) => Demo.BenchmarkDotNet.BubbleSort.Sort(nums);

使用BenchmarkDotNet 模板

  1. 安装模板
  1. dotnet new -i BenchmarkDotNet.Templates
  1. 创建模板
  1. dotnet new benchmark

使用BenchmarkDotNet dotnet tool

  1. 安装
  1. dotnet tool install -g BenchmarkDotNet.Tool
  1. 使用
  1. dotnet benchmark [arguments] [options]

转载请标明出处 : https://www.cnblogs.com/WilsonPan/p/12904664.html

示例源码

【基准测试】BenchmarkDotNet介绍的更多相关文章

  1. 基于mysql的基准测试

    常用的基准测试工具介绍: mysql基准测试工具: mysqlslap,mysql自带的工具,对于性能测试不建议使用 特点: 可以模拟服务器负载,并输出相关统计信息 可以指定也可以自动生成查询语句 常 ...

  2. 9-MySQL DBA笔记-测试实践

    第9章 测试实践 在第8章中介绍了测试所需要的理论知识,本章将为读者讲述实际的测试过程.实际测试一般包括硬件测试.MySQL基准测试及应用服务压力测试,下面将分别讲述这三方面的内容.此外,测试工具的选 ...

  3. 寻找性能更优秀的动态 Getter 和 Setter 方案

    反射获取 PropertyInfo 可以对对象的属性值进行读取或者写入,但是这样性能不好.所以,我们需要更快的方案. 方案说明 就是用表达式编译一个 Action<TObj,TValue> ...

  4. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试

    本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍, ...

  5. benchmarkdotnet dotnet 基准测试类库试用(一)

    使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果 benchmarkdotnet 是dotnet 版本的一个工具,以下是一个简单的试用 环境准备 我使用的是 ...

  6. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】

    Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...

  7. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  8. 性能测试工具BenchmarkDotnet

    .NET Core中的性能测试工具BenchmarkDotnet https://www.cnblogs.com/lwqlun/p/9671611.html 背景介绍 之前一篇博客中,我们讲解.NET ...

  9. 一篇文章看懂TPCx-BB(大数据基准测试工具)源码

    TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...

随机推荐

  1. 基于Neo4j的个性化Pagerank算法文章推荐系统实践

    新版的Neo4j图形算法库(algo)中增加了个性化Pagerank的支持,我一直想找个有意思的应用来验证一下此算法效果.最近我看Peter Lofgren的一篇论文<高效个性化Pagerank ...

  2. 即时通信WebSocket 和Socket.IO

    WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...

  3. 从零开始学习docker之在docker中搭建redis(单机)

    docker搭建redis 一.环境准备 云环境:CentOS 7.6 64位 二.下载镜像 从docker hub中找到redis镜像 传送门------https://hub.docker.com ...

  4. SVN部署(Centos7,Ubuntu)

    SVN 简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Sub ...

  5. Docker简单操作(二)

    1.docker容器简单操作 docker search 镜像名 #搜索镜像.如docker search nginx docker pull alpine #拉取镜像.alpine是比较小的镜像 d ...

  6. JAVA企业级应用TOMCAT实战(二)

    使用普通用户运行 使用普通用户来部署服务是比较安全的做法 [root@tomcat application]# useradd -u tomcat [root@tomcat application]# ...

  7. 第八章服务器raid及配置实战

      版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 总容量的一半 ...

  8. ansible一键安装mysql8.0

    ansbile安装: # ansible在CentOS7中需要安装epel仓库 yum install -y epel-release yum install -y ansible 安装有好几种方法, ...

  9. 配置IIS5.5/6.0 支持 Silverlight

    在安装完Silverlight1.1 Alpha后,要使自己的IIS服务器支持Silverlight的浏览还需要配置一下IIS网站的 Http头->MIME映射添加内容如下:扩展名        ...

  10. Eclipse新建类的时候如何自动添加注释(作者,时间,版本等信息)

    为什么80%的码农都做不了架构师?>>>   方法一:Eclipse中设置在创建新类时自动生成注释 windows–>preference  Java–>Code Sty ...