首页 > 其他分享 >基准测试工具 --- BenchmarkDotNet

基准测试工具 --- BenchmarkDotNet

时间:2023-07-21 13:57:30浏览次数:36  
标签:BenchmarkDotNet 基准 测试运行 --- dotnet 测试 测试工具 控制台

介绍

今天介绍一个非常强大的基于.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单元测试的基准测试:

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

class Program
{
    static void Main(string[] args)
    {
        BenchmarkRunner.Run<BenchmarkTest>();
    }
}

[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

标签:BenchmarkDotNet,基准,测试运行,---,dotnet,测试,测试工具,控制台
From: https://www.cnblogs.com/pandefu/p/17536270.html

相关文章

  • 最高法-公司实际控制人签订的合同对公司有约束力
    (2018)最高法民再361号  上海新长征国际贸易有限公司、宁波保税区明正国际贸易有限公司确认合同无效纠纷再审民事判决书本院认为:本院认为,《中华人民共和国公司法》第二百一十六条第三项规定:“实际控制人,是指虽不是公司的股东,但通过投资关系、协议或者其他安排,能够实际支配公司......
  • 最高法-实际控制人确认债权的,若相对人有理由相信其系公司职务行为,则可以参照表见代理
    (2021)最高法民申4920号  清涧县华阳鸿基置地有限责任公司、湖南鹏华装饰设计工程有限责任公司等建设工程施工合同纠纷其他民事民事裁定书本院认为:本院认为,本案系当事人申请再审案件,应当围绕华阳公司主张的再审事由能否成立进行审查。根据华阳公司的再审申请理由,本案主要审查了......
  • window-docker+rengine搭建
    Docker安装+rengine部署开始window环境部署之旅安装windows子系统开启window虚拟化1、从搜索中找到控制面板,而后在控制面板中找到程序与功能2、选择启用与关闭,找到hyper-v,选中,再确认后等待一会,会提示是否重启,选择重启。3、重新开机后Win+R打开运行->输入cmd进入到命令提......
  • CF1155F Delivery Oligopoly 警告与思考--zhengjun
    警告:注意区分【强连通分量】,【边双联通分量】,【点双连通分量】。思考:之前没有做到过边双连通分量的拆解;一个边双联通分量可以看作一个基环上不断加一条链;注意,这里加的链首尾可以为同一个位置。到这步代码就好弄了。代码#include<bits/stdc++.h>usingnamespace......
  • CentOS-Mysql 自动备份-shell 脚本
    功能说明:在服务器A上,每天自动运行一个shell脚本;备份数据库db;然后将sql文件放到另一台服务器B上。新建文件:mysql_backup.sh内容是:#!/bin/bashHOST=127.0.0.1USERNAME=rootPASSWORD=rootDBNAME=adverserverHost=123.123.123.123DATE=$(date+%Y%m%d)OLDDATE=$(date-d......
  • python3 爬取 vue-ssr数据
    使用Python3爬取Vue-SSR数据介绍在Web开发中,Vue-SSR(VueServerSideRendering)是一种将Vue.js应用程序在服务器端进行渲染的技术。它允许搜索引擎爬取到完整的HTML页面,这对于SEO(搜索引擎优化)非常重要。本文将介绍如何使用Python3爬取Vue-SSR数据的方法,并提供相应的代码示例。准......
  • Atcoder Regular Contest 124 E - Pass to Next
    首先第一步是一个浅显的观察:我们要求的是所有可能的最终序列的贡献之和,如果能改为计算所有操作序列的贡献之和那问题会简单很多,并且我们惊奇地发现,如果一组\(x_i\)全大于\(0\),那么把它们全减去\(1\)以后得到的答案序列不会改变,而对于任意一种可能的最终序列,必然存在一组\(\m......
  • 7.17-7.27 每周报告总结
    这周还是基本上以学习为主,生活变得很有规律,每天5.30起床,去打球,基本上打到7点多一点,然后吃个早饭,去教育局上班,早上一般没啥事,基本上就是在办公室学习,从8点到12点,然后回家吃个饭,睡午觉,2点半起床,接着去教育局上班,有活的时候帮忙干一点活,没活的时候就是学一会,玩一会的,到6点下班,回家吃......
  • 拓端tecdat|R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......
  • 线段树--区间最大值模板
    Smiling&Weeping----你是我绕过的山河错落,才找到的人间烟火ProblemDescriptionThereisasequence a oflength n.Weuse ai todenotethe i-thelementinthissequence.Youshoulddothefollowingthreetypesofoperationstoth......