使用 BenchmarkDotNet 对 C# 代码进行基准测试
作者:码农读书 发布时间:2023-06-25 00:38:49
目录
安装 BenchmarkDotNet
什么是基准测试
创建基准测试代码
运行 benchmark
BenchmarkDotNet 是一个轻量级,开源的,强大的 .NET 工具包,它可以将你的方法转化为基准并跟踪这些方法,最后对这些方法的性能提供一些测试报告,使用 BenchmarkDotNet 玩 基准测试 是非常容易的。
你可以利用 BenchmarkDotNet 在 .NET Framework 和 .NET Core 应用程序上实现基准测试,在这篇文章中,我们将会讨论如何在 .NET Core 中实现基准测试。
安装 BenchmarkDotNet
要想使用 BenchmarkDotNet,要么通过 Nuget 可视化窗口安装 BenchmarkDotNet,要么使用NuGet Package Manager Console 命令行窗口输入如下命令。
Install-Package BenchmarkDotNet
什么是基准测试
基准测试 是对应用程序的一段代码的性能提供一个或者一组度量值,度量代码本质上来说就是让你清楚的了解你的应用程序的性能到底是怎么样的,当你想优化代码的时候,如果手边有这些性能度量值那该有多好呀~ 基准测试也可以帮助我们缩小到那些必须要重构的代码。
创建基准测试代码
新建 BenchmarkDotNet 类,类定义如下
[MemoryDiagnoser]
public class MemoryBenchmarkerDemo
{
int NumberOfItems = 100000;
[Benchmark]
public string ConcatStringsUsingStringBuilder()
{
var sb = new StringBuilder();
for (int i = 0; i < NumberOfItems; i++)
{
sb.Append("Hello World!" + i);
}
return sb.ToString();
}
[Benchmark]
public string ConcatStringsUsingGenericList()
{
var list = new List<string>(NumberOfItems);
for (int i = 0; i < NumberOfItems; i++)
{
list.Add("Hello World!" + i);
}
return list.ToString();
}
}
上面的代码展示了如何做 基准测试, 做法很简单,在方法上标记 Benchmark 特性即可,接下来就可以 Main 方法中启动 基准测试,代码如下:
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<MemoryBenchmarkerDemo>();
}
运行 benchmark
值得注意的是,一定要用 release 模式运行,如果用debug的话,会抛如下错误的。
调整为 release 模式后,将程序跑起来,要稍微跑一段时间,最后将会看到 console 输出如下的 summary。
从图中可以看到,summary中会包含比如:BenchmarkDotNet版本,操作系统,计算机硬件,.NET版本,编译器信息和一些应用程序相关的性能信息,从图中也可以看出 ConcatStringUsingStringBuilder 方法比 ConcatStringUsingGenericList 方法性能更高,付出的代价就是占用更多的内存。
接下来在 MemoryBenchmarkerDemo 类上标注 RankColumn 标记,这样会在输出结构中多一个给程序排名的 Rank 列,修改代码如下:
[MemoryDiagnoser, RankColumn]
public class MemoryBenchmarkerDemo
{
...
}
接下来再将程序跑起来,观察最后的 summary,可以清楚的看到多了一个 Rank 列。
BenchmarkDotNet 提供了一种简单的方式让你拥有了对应用程序的性能知情权,如果你想了解更多关于如何在 ASP.NET Core 中使用 BenchmarkDotNet,参考github:https://github.com/aspnet/benchmarks
来源:https://mp.weixin.qq.com/s?__biz=MzU4Mjc4NzgyOQ==&mid=2247488777&idx=1&sn=6f4c5e91f12ed3a50cc26662c0593759


猜你喜欢
- 利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识。w表示白棋,b表示黑棋import java.util.S
- java 可变参数详解 可变参数(Varargs)使程序员可以声明一个接受可变数目参数的方法。可变参数也
- 在wpf中实现treeview的功能,可能看到很多分享的都是简单的绑定,仅此记录自己完成的功能。前台<TreeView x:Name=
- 你还在生产节点开放Swagger吗,赶紧停止这种暴露接口的行为吧。学习目标快速学会使用注解关闭Swagger2,避免接口重复暴露。使用教程禁
- 本文实例讲述了C#操作session的类。分享给大家供大家参考。具体分析如下:这个C#类对session操作进行了再次封装,可以大大简化se
- 本文为大家分享Android自定义Spinner适配器的相关知识点,供大家参考,具体内容如下一、大致效果二.关键代码在注释中讲重点吧。 (1
- 验证码的实现原理: 在一个Servlet中生成验证,并把验证码上的数据保存在Session,用户提交验证码之后,会提交给另外一个
- Activiti 介绍Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调
- 大多数浏览器会对同一域名的请求限制请求数量,一般是在8个以内。每次最多可以同时请求8个,要是资源多于8个,那么剩下的就要排队等待请求了。所以
- 冒泡排序冒泡排序的思想: 每次让当前的元素和它的下一个元素比较大小、如果前一个的元素大于后一个元素的话,交换两个元素。这样的话经历一次扫描之
- Android 列表选择框 Spinner详解及实例Spinner 是 Android 的列表选择框,不过 spinner 并不需要显示下拉
- 1.引入如下依赖<dependency> <groupId>org.spri
- Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的
- 前言本文将介绍通过Java编程在PDF文档中添加表格的方法。添加表格时,可设置表格边框、单元格对齐方式、单元格背景色、单元格合并、插入图片、
- 在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启、提交、
- 如下所示:private void readImage(String filename) throws FileNotFound
- 先来看看下面List<T>泛型集合的排序例子:using System;using System.Collections.Gen
- 一 模式介绍重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己
- using System;using System.Data;using System.Data.OleDb;namespace ZFSof
- 一、DurationDuration主要用来衡量秒级和纳秒级的时间,使用于时间精度要求比较高的情况。先来看看Duration的定义:publ