【基准测试】BenchmarkDotNet介绍
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 快速入门
- 添加包
dotnet add package BenchmarkDotNet
- 添加需要基准测试的方法(这里我准备两个排序算法,快速排序 && 堆排序)
[Benchmark]
[Arguments(new int[] { 3, 1, 10, 9, 6, 2, 5, 7, 8, 4 })]
public void QuickSort(int[] nums) => Demo.BenchmarkDotNet.QuickSort.Sort(nums);
[Benchmark]
[Arguments(new int[] { 3, 1, 10, 9, 6, 2, 5, 7, 8, 4 })]
public void HeapSort(int[] nums) => Demo.BenchmarkDotNet.HeapSort.Sort(nums);
- Main里执行BenchmarkRunner.Run
var summary = BenchmarkRunner.Run<QuickSortVsHeapSort>();
- 执行(需要Release模式)
dotnet run -c=Release
- 分析结果
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18363.778 (1909/November2018Update/19H2)
Intel Core i7-10510U CPU 1.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.202
[Host] : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
DefaultJob : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
| Method | nums | Mean | Error | StdDev |
|---------- |---------- |---------:|---------:|---------:|
| QuickSort | Int32[10] | 61.98 ns | 0.242 ns | 0.202 ns |
| HeapSort | Int32[10] | 89.19 ns | 0.374 ns | 0.332 ns |
除了控制台,还可以在BenchmarkDotNet.Artifacts/result
找到多种格式的输出结果
可以看到QuickSort ,HeapSort比较接近,但是我们测试的数据量太少,所以这个没代表性
- 总结
可以看到BenchmarkDotNet对原来的代码是没有侵入式,通常我是新建一个测试类,然后再测试类初始化测试参数,这样对原来代码没有侵入
进阶用法
多组输入参数
[Benchmark]
[ArgumentsSource(nameof(Data))]
public void QuickSort(int[] nums) => Demo.BenchmarkDotNet.QuickSort.Sort(nums);
public IEnumerable<int[]> Data()
{
var random = new Random();
var datas = Enumerable.Range(1, 10000).ToArray();
// 打乱数组
for (int i = datas.Length - 1; i > 0; i--)
{
var value = datas[i];
var randomIndex = random.Next(0, i);
datas[i] = datas[randomIndex];
datas[randomIndex] = value;
}
yield return datas.Take(100).ToArray();
yield return datas.Take(1000).ToArray();
yield return datas;
}
ArgumentsSource
: 参数可以是方法/属性的名称
多平台比较
- 在基准测试类中添加SimpleJob
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
[SimpleJob(RuntimeMoniker.Net472)]
public class QuickSortVsHeapSort
{
}
- 项目方案添加多个运行时
<TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
添加统计字段
在基准测试类添加MaxColumn
, MinColumn
,MemoryDiagnoser
[MaxColumn, MinColumn, MemoryDiagnoser]
public class QuickSortVsHeapSort
{
...
}
添加基准
比较快速排序和堆排序,可以用其中一个作为基准,也可以新增一个作为基准作为参考。例如这里选择以冒泡排序作为基准 ,下图是各个排序算法的时间复杂度
排序 | 平均情况 | 最坏情况 | 最好情况 | 空间复杂度 |
---|---|---|---|---|
冒泡排序 | 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) |
[Benchmark(Baseline = true)]
[ArgumentsSource(nameof(Data))]
public void BubbleSort(int[] nums) => Demo.BenchmarkDotNet.BubbleSort.Sort(nums);
使用BenchmarkDotNet 模板
- 安装模板
dotnet new -i BenchmarkDotNet.Templates
- 创建模板
dotnet new benchmark
使用BenchmarkDotNet dotnet tool
- 安装
dotnet tool install -g BenchmarkDotNet.Tool
- 使用
dotnet benchmark [arguments] [options]
转载请标明出处 : https://www.cnblogs.com/WilsonPan/p/12904664.html
示例源码
【基准测试】BenchmarkDotNet介绍的更多相关文章
- 基于mysql的基准测试
常用的基准测试工具介绍: mysql基准测试工具: mysqlslap,mysql自带的工具,对于性能测试不建议使用 特点: 可以模拟服务器负载,并输出相关统计信息 可以指定也可以自动生成查询语句 常 ...
- 9-MySQL DBA笔记-测试实践
第9章 测试实践 在第8章中介绍了测试所需要的理论知识,本章将为读者讲述实际的测试过程.实际测试一般包括硬件测试.MySQL基准测试及应用服务压力测试,下面将分别讲述这三方面的内容.此外,测试工具的选 ...
- 寻找性能更优秀的动态 Getter 和 Setter 方案
反射获取 PropertyInfo 可以对对象的属性值进行读取或者写入,但是这样性能不好.所以,我们需要更快的方案. 方案说明 就是用表达式编译一个 Action<TObj,TValue> ...
- Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试
本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍, ...
- benchmarkdotnet dotnet 基准测试类库试用(一)
使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果 benchmarkdotnet 是dotnet 版本的一个工具,以下是一个简单的试用 环境准备 我使用的是 ...
- Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】
Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...
- .NET Core中的性能测试工具BenchmarkDotnet
背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...
- 性能测试工具BenchmarkDotnet
.NET Core中的性能测试工具BenchmarkDotnet https://www.cnblogs.com/lwqlun/p/9671611.html 背景介绍 之前一篇博客中,我们讲解.NET ...
- 一篇文章看懂TPCx-BB(大数据基准测试工具)源码
TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...
随机推荐
- prefetch 和 preload 及 webpack 的相关处理
使用预取和预加载是网站性能和用户体验提升的一个很好的途径,本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法,并使用 webpack 进行实现 Link 的链接类型 < ...
- nginx history路由模式时,页面返回404重定向index.html
1.路由默认是带#的,有时我们感觉不美观,就使其变为history模式,也就没有#字符 2.# 如果找不到当前页面(404),就返回index.html,重新分配路由 location ^~/prod ...
- 二叉树中两节点的最近公共父节点(360的c++一面问题)
面试官的问题:写一个函数 TreeNode* Find(TreeNode* root, TreeNode* p, TreeNode* q) ,返回二叉树中p和q的最近公共父节点. 本人反应:当时有点 ...
- phpstudy xdebug 配置
来源:https://baijiahao.baidu.com/s?id=1607680791440431678&wfr=spider&for=pc https://www.cnblog ...
- css3变形
CSS3变形--旋转 rotate() 旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点 ...
- [C语言] 获得 pwd 的几种函数
_getcwd() GetCurrentDirectory GetModuleFileName main函数参数 argv[0] // crt_getcwd.c // This program pla ...
- 【Linux常见命令】sort命令
sort - sort lines of text files sort命令用于将文本文件内容加以排序. sort可针对文本文件的内容,以行为单位来排序. 语法: sort [OPTION]... [ ...
- 流畅的python读书笔记-第十章-继承优缺点
继承的优缺点 推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架.--Alan Kay 子类化内置类型很麻烦 (如 list 或 dict)) ,别搞这种 直接子类化内置类型(如 dict.li ...
- 数学--数论--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 ...
- unittest 管理用例生成测试报告
# 登录方法的封装 from appium import webdriver from time import sleep from python_selenium.Slide import swip ...