基准测试工具 --- BenchmarkDotNet
介绍
今天介绍一个非常强大的基于.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)
接下来,以一个基于控制台的基准测试来讲解一下:
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),表格中也能看到具体性能,比如,
- Method(测试方法的名称为CreateTuple)。
- Mean(测试运行的平均时间为420.7纳秒)。
- Error(测试运行的标准误差为16.96纳秒)。
- StdDev(所有测试运行的标准偏差为1630纳秒)。
- 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
作者: Niuery Daily
出处: https://www.cnblogs.com/pandefu/>
邮箱: defu_pan@163.com
关于作者:.Net Framework,.Net Core ,WindowsForm,WPF ,控件库,多线程
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接,否则保留追究法律责任的权利。 如有问题, 可邮件咨询。