首页 > 其他分享 >BenchmarkDotNet 概述--性能测试

BenchmarkDotNet 概述--性能测试

时间:2023-05-24 21:56:02浏览次数:51  
标签:nums -- BenchmarkDotNet int 概述 dotnet public datas

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. 添加包
dotnet add package BenchmarkDotNet
  1. 添加需要基准测试的方法(这里我准备两个排序算法,快速排序 && 堆排序)
[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);
  1. Main里执行BenchmarkRunner.Run
var summary = BenchmarkRunner.Run<QuickSortVsHeapSort>();
  1. 执行(需要Release模式)
dotnet run -c=Release
  1. 分析结果
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比较接近,但是我们测试的数据量太少,所以这个没代表性

  1. 总结

可以看到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 : 参数可以是方法/属性的名称

多平台比较

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

添加统计字段

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

[MaxColumn, MinColumn, MemoryDiagnoser]
public class QuickSortVsHeapSort
{
  ...
}

添加基准

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

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

使用BenchmarkDotNet 模板

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

使用BenchmarkDotNet dotnet tool

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

转载于 : https://www.cnblogs.com/WilsonPan/p/12904664.html
示例源码

标签:nums,--,BenchmarkDotNet,int,概述,dotnet,public,datas
From: https://www.cnblogs.com/zhujxiao/p/17429644.html

相关文章

  • GitlabCI学习笔记之三:GitLabRunner pipeline语法之tags allow_faillure when retry ti
    1.tags用于从允许运行该项目的所有Runner列表中选择特定的Runner,在Runner注册期间,您可以指定Runner的标签。tags可让您使用指定了标签的runner来运行作业,此runner具有ruby和postgres标签。示例给定带有osx标签的OSXRunner和带有windows标签的WindowsRunner,以下作业将在......
  • mybatis关于自定义映射的使用方法
    在MyBatis中,可以通过SQL映射文件来自定义映射,即将一个查询结果映射成一个Java对象。在映射中,我们可以控制如何从查询结果中提取数据,并将其映射到Java对象的属性中。以下是一些常用的自定义映射方式:resultMap:使用resultMap元素来定义映射规则,可以精确地将查询结果映......
  • 三款Github Copilot的免费替代
    大家好我是费老师,提起GithubCopilot,相信很多读者朋友们都听说过甚至使用过,作为Github研发的一款先进的编程辅助插件,它可以在我们日常编写代码的过程中,根据代码的上下文内容、注释等信息自动推断生成高质量的代码,很大程度上提升我们的代码编写效率。而自从去年8月GithubCo......
  • k8s Pod状态详解
    k8sPod状态详解在Kubernetes中,Pod是最小的可部署的计算单元,它是一组容器的集合,共享同一个网络命名空间、存储卷等资源。Kubernetes中的Pod有以下几种状态:Pending(挂起):Pod已经被KubernetesAPI接受,但它的容器镜像还没有被拉取,或者Pod所需的节点资源(CPU、内存等)还没......
  • 杂题乱做
    给一棵有根树,求距离\(x\toy\)的链不大于\(d\)的点的个数。保证\(x\)是\(y\)的祖先。\(d\len,q\le2e5\)。冷静分析一波,我们发现假如我们设\(f_{u,d}\)表示\(u\)子树内距离不超过\(d\)的点的个数,我们要算的就是\(\sum_{u\inx\toy}f_{u,d}-f_{u,d-1}+f_{x,d-1......
  • java基于springboot+vue的书籍学习平台管理系统,学期学习论坛管理系统,附源码+数据库+lw
    1、项目介绍困扰管理层的许多问题当中,书籍学习将会是不敢忽视的一块。但是管理好书籍学习又面临很多麻烦需要解决,在工作琐碎,记录繁多的情况下将书籍学习的当前情况反应给相关部门决策,等等。在此情况下开发一款书籍学习平台,于是乎变得非常合乎时宜。经过网上调查和搜集数据,......
  • 每日总结-23.5.24
    packagesan;importjava.sql.*;publicclassThesql{publicConnectionconnect;publicThesql()throwsException{Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/web?useUnicode=......
  • PRESTO pulsar 出版图编辑剪切
    折叠,仅仅显示轮廓prepfold-n64-npart128-accelcand361-accelfileNGC6517_20221231_DM182.50_ACCEL_20.cand-justprofs-noxwin-nosearchNGC6517_20221231_DM182.50.datprepfold-n64-npart128-parJ1801-0857K_5.par-justprofs-noxwin-nosearch-topo-oN......
  • 每日一题 力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/
    力扣1377https://leetcode.cn/problems/frog-position-after-t-seconds/这道题目用dp去做,构建邻接矩阵,做的时候需要注意题目条件,如果青蛙跳不动了,这个概率就保持不变了一般跳青蛙,很容易想到dp核心代码如下publicdoublefrogPosition(ipublicdoublefrogPosition(intn,......
  • 2023.5.24
     1#include<iostream>2#include<iomanip>3usingnamespacestd;4classHorse5{6public:7Horse()8{9cout<<"Horse申请了空间..."<<endl;10}11virtual~Horse()12{13......