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. prefetch 和 preload 及 webpack 的相关处理

    使用预取和预加载是网站性能和用户体验提升的一个很好的途径,本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法,并使用 webpack 进行实现 Link 的链接类型 < ...

  2. nginx history路由模式时,页面返回404重定向index.html

    1.路由默认是带#的,有时我们感觉不美观,就使其变为history模式,也就没有#字符 2.# 如果找不到当前页面(404),就返回index.html,重新分配路由 location ^~/prod ...

  3. 二叉树中两节点的最近公共父节点(360的c++一面问题)

    面试官的问题:写一个函数  TreeNode* Find(TreeNode* root, TreeNode* p, TreeNode* q) ,返回二叉树中p和q的最近公共父节点. 本人反应:当时有点 ...

  4. phpstudy xdebug 配置

    来源:https://baijiahao.baidu.com/s?id=1607680791440431678&wfr=spider&for=pc https://www.cnblog ...

  5. css3变形

    CSS3变形--旋转 rotate() 旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点 ...

  6. [C语言] 获得 pwd 的几种函数

    _getcwd() GetCurrentDirectory GetModuleFileName main函数参数 argv[0] // crt_getcwd.c // This program pla ...

  7. 【Linux常见命令】sort命令

    sort - sort lines of text files sort命令用于将文本文件内容加以排序. sort可针对文本文件的内容,以行为单位来排序. 语法: sort [OPTION]... [ ...

  8. 流畅的python读书笔记-第十章-继承优缺点

    继承的优缺点 推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架.--Alan Kay 子类化内置类型很麻烦 (如 list 或 dict)) ,别搞这种 直接子类化内置类型(如 dict.li ...

  9. 数学--数论--HDU 1792 A New Change Problem (GCD+打表找规律)

    Problem Description Now given two kinds of coins A and B,which satisfy that GCD(A,B)=1.Here you can ...

  10. unittest 管理用例生成测试报告

    # 登录方法的封装 from appium import webdriver from time import sleep from python_selenium.Slide import swip ...