如何使用 BenchmarkDotNet 对 C# 代码进行基准测试
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://www.infoworld.com/article/3573782/how-to-benchmark-c-code-using-benchmarkdotnet.html
.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
【.NET Core微服务实战-统一身份认证】开篇及目录索引
Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
用abp vNext快速开发Quartz.NET定时任务管理界面