Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >性能基准测试工具 --- BenchmarkDotNet

性能基准测试工具 --- BenchmarkDotNet

作者头像
Niuery Diary
发布于 2023-10-22 08:58:45
发布于 2023-10-22 08:58:45
77901
代码可运行
举报
运行总次数:1
代码可运行

介绍

今天介绍一个非常强大的基于.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」能够自动在所有运行时运行基准,汇总测试结果,并打印一个汇总表,其中包含众多基准信息:

这些测试数据也可以导出为不同的格式(md, html, csv, xml, json等),包括图片:

最主要的是它可以非常容易的编写基准测试,只需要安装好NuGet包之后,给需要测试的方法标注 Attribute,就可以执行测试。

Demo

这里可以使用控制台或单元测试来进行测试。

官方GitHub上分别提供了基于控制台和基于XUnit单元测试的基准测试:

  • 基于控制台Demo(https://github.com/dotnet/BenchmarkDotNet/tree/master/samples/BenchmarkDotNet.Samples)
  • 基于Xunit单元测试Demo(https://github.com/dotnet/BenchmarkDotNet/tree/master/tests/BenchmarkDotNet.IntegrationTests)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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次。

接下来,来看一下测试结果,输出:

讲解

可以看到控制台输出分为了几个部分。

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」 内容 ,如下图所示:

默认给你生成了三种格式的报告,CSV格式,Markdownn格式,和Html格式,生成路径是运行根目录下的BenchmarkDotNet.Artifacts\results\文件夹下的 BenchmarkDotNet.Console.BenchmarkTest-report文件。

总结

本篇抛砖引玉,只讲述基于控制台做基准测试,强烈建议各位看官阅读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 ❞

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Niuery Diary 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
在软件开发领域,性能基准测试是确保软件系统高效、稳定运行的重要环节。它可以帮助你评估应用程序的性能,了解其在不同条件下的响应时间、吞吐量、资源利用率等。通过基准测试,你可以确定系统在处理特定工作负载时的性能表现。
追逐时光者
2024/11/28
2220
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
在软件开发领域,性能基准测试是确保软件系统高效、稳定运行的重要环节。它可以帮助你评估应用程序的性能,了解其在不同条件下的响应时间、吞吐量、资源利用率等。通过基准测试,你可以确定系统在处理特定工作负载时的性能表现。
郑子铭
2025/01/01
2260
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
【译】使用 Visual Studio Profiler 进行基准测试
在 Visual Studio 17.13 预览版中,我们发布了更新的 BenchmarkDotNet 诊断器,允许您使用性能分析器中的更多工具来分析基准测试。有了这个变化,可以非常快速地挖掘 CPU 使用情况和内存分配,从而使测量/修改/测量周期快速而高效。
郑子铭
2025/03/10
2440
【译】使用 Visual Studio Profiler 进行基准测试
C# 标准性能测试
经常我写一个类,作为一个工具类,小伙伴会问我这个类的性能,这时我就需要一个标准的工具进行测试。 本文告诉大家如何使用 benchmarkdotnet 做测试。
林德熙
2018/09/19
1.3K0
C# 标准性能测试
牛逼了!教你如何使用Pytest测试框架开展性能基准测试!
在软件开发中,性能测试和基准测试是确保软件质量不可或缺的一部分。今天,将给大家推荐一款强大的工具——pytest-benchmark,它能够帮助我们轻松地集成基准测试到我们的pytest测试套件中。
测试开发技术
2024/06/28
5100
牛逼了!教你如何使用Pytest测试框架开展性能基准测试!
基准测试工具:Wrk初识
最近和同事聊起常用的一些压测工具,谈到了Apache ab、阿里云的PTS、Jmeter、Locust以及wrk各自的一些优缺点和适用的场景类型。这篇文章,简单介绍下HTTP基准测试工具wrk的基本使用方法。。。
老_张
2019/12/02
9110
Java基准测试工具JMH详解
JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM. JMH是一种Java工具,用于构建、运行和分析用Java和其他针对JVM的语言编写的nano/micro/mili/macro基准测试。
全栈程序员站长
2022/09/08
1.1K0
MySQL基准测试工具MySQLSlap使用实例
MySQLSlap是MySQL自带的基准测试工具,无需单独安装即可使用。下面记录一下在服务器上用 MySQLSlap做MySQL基本测试的步骤。
星哥玩云
2022/08/13
1.5K0
MySQL基准测试工具MySQLSlap使用实例
dotnet C# 在不同的机器 CPU 型号上的基准性能测试
本文将记录我在多个不同的机器上,在不同的 CPU 型号上,执行相同的我编写的 dotnet 的 Benchmark 的代码,测试不同的 CPU 型号对 C# 系的优化程度。本文非严谨测试,数值只有相对意义
林德熙
2024/06/16
3740
dotnet C# 在不同的机器 CPU 型号上的基准性能测试
Java基准测试工具JMH使用
JMH,即Java Microbenchmark Harness,这是专门用于进行代码的微基准测试的一套工具API。 JMH 由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发 。何谓 Micro Benchmark 呢? 简单地说就是在 方法层面上的 benchmark,精度可以精确到微秒级。 本文主要介绍了性能基准测试工具 JMH,它可以通过一些功能来规避由 JVM 中的 JIT 或者其他优化对性能测试造成的影响。 Java的基准测试需要注意的几个点:
全栈程序员站长
2022/09/18
6290
Java基准测试工具JMH使用
Go 语言基准测试入门
之前在写 Java 的文章的时候,如果想在本地进行某段代码的性能测试(通常是对比另外一段或者几段),就会用到基准测试框架 JMH ,也的确非常好用。虽然我学习 Go 语言有一段时间了,对于基准测试还没有涉猎,下面就分享Go 语言的基准测试入门实践。
FunTester
2025/01/23
940
Go 语言基准测试入门
精选 10 个 C#/.NET 开发必备开源库!
DotNetGuide专栏C#/.NET/.NET Core编程技巧练习集:C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库、工作业务实操练习集,配套详细的文章教程讲解,助你快速掌握C#/.NET/.NET Core中各种编程常用语法、算法、技巧、中间件、类库、工作业务实操等等。
追逐时光者
2025/07/18
830
精选 10 个 C#/.NET 开发必备开源库!
基准测试框架JMH使用详解
JMH即Java Microbenchmark Harness,是Java用来做基准测试的一个工具,该工具由OpenJDK提供并维护,测试结果可信度高。
全栈程序员站长
2022/09/14
7560
MySQL基准测试 转
基准测试是  指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。例如,对计算机CPU进行浮点运算、数据访问的带宽和延迟等指标的基准测试,可以使用户清楚地了解每一款CPU的运算性能及作业吞吐能力是否满足应用程序的要求;
wuweixiang
2018/08/14
2.2K0
MySQL基准测试
                                                                            转
【学习】性能基准测试:KVM大战Xen
在上周,我们对 KVM 和 Xen 近几年里在性能上的改进进行了一些有趣的探讨后,我打算自己做一些这方面的小研究。我能找到的最新的资料,是来自2013年 Phoronix Haswell 性能评测上的基准测试。当然,还有其它一些2011年的评测,不过由于 Xen 被收录进 Kernel 3.0,它们都已被热烈地讨论过。 2011年的测试提供了许多很好的基准报表,在三年后的现在,我尽最大努力把它们列出的属性重新测试一遍。但我删减了其中两三个基准测试,原因是它们在未经特定优化的配置后跑出来的数据不是很好,
小莹莹
2018/04/19
1.7K0
【学习】性能基准测试:KVM大战Xen
ASP.NET Core 6 的性能改进
受到 由Stephen Toub 发布的关于 .NET 性能的博客的启发,我们正在写一篇类似的文章来强调ASP.NET Core 在6.0 中所做的性能改进。
郑子铭
2022/03/22
1.9K0
ASP.NET Core 6 的性能改进
聊聊springboot项目如何利用jmh来进行基准测试
JMH(Java Microbenchmark Harness)是由OpenJDK团队开发的一个用于Java微基准测试工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能,包括方法调用、对象创建以及其他类型的 JVM 级别的操作。JMH 通过生成优化过的字节码来确保基准测试不受常见陷阱的影响,如热身不足、垃圾回收干扰、编译器优化等,从而产生更准确的性能指标
lyb-geek
2024/07/09
3070
聊聊springboot项目如何利用jmh来进行基准测试
Linux 性能基准测试工具及测试方法
上篇文章 「什么?相同型号物理机 容器性能不如虚拟机?」 ,给我们的经验教训,就是上线前,基准测试的重要性,这篇文章着重介绍一下「Linux 性能基准测试工具及测试方法」
SRE运维进阶之路
2024/04/23
7110
Linux 性能基准测试工具及测试方法
了解 .NET 9 中的新增的包 Microsoft.AspNetCore.OpenApi
.NET9 剔除内置的 Swagger/Swashbuckle 组件,新增 Microsoft.AspNetCore.OpenApi 包。
郑子铭
2024/11/23
4780
了解 .NET 9 中的新增的包 Microsoft.AspNetCore.OpenApi
基准测试工具JMH
Java Microbenchmark Harness,简称JMH,由OpenJDK开发,用来构建、运行和分析Java或其他JVM语言代码的微基准测试框架。适合于方法级别的细粒度测试,并不适用于系统之间的链路测试。
johnny666
2024/09/28
1600
相关推荐
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档