BenchmarkDotNet简单的基准测试 电脑版发表于:2021/5/10 14:18 ![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#BenchmarkDotNet简单的基准测试 [TOC] BenchmarkDotNet简单介绍 ------------ >**BenchmarkDotNet** 可帮助您将方法转换为基准,跟踪其性能并共享可重复的测量实验。这不比编写单元测试难!在幕后,借助perfolizer统计引擎,它可以执行许多魔术操作,从而确保可靠,精确的结果。BenchmarkDotNet可保护您免受普遍的基准测试错误的影响,并在基准设计或获得的测量出现问题时警告您 Demo示例 ------------ ### 创建控制台项目与安装BenchmarkDotNet tn>按照如下命令可安装到项目中 ```bash Install-Package BenchmarkDotNet ``` ![](https://img.tnblog.net/arcimg/hb/87f735c01f2d40f891e819926ca8cb73.png) ### 添加测试类与方法 >我们通过在方法体上标记`Benchmark`特性来指定哪些方法需要进行测试 ```csharp public class Md5VsSha256 { private const int N = 10000; private readonly byte[] data; private readonly SHA256 sha256 = SHA256.Create(); private readonly MD5 md5 = MD5.Create(); public Md5VsSha256() { data = new byte[N]; new Random(42).NextBytes(data); } [Benchmark] public byte[] Sha256() => sha256.ComputeHash(data); [Benchmark] public byte[] Md5() => md5.ComputeHash(data); } ``` >在`Main`方法中写入下列代码进行对`Md5VsSha256`类下的方法基准测试 ```csharp BenchmarkRunner.Run<Md5VsSha256>(); ``` ### 运行测试 tn>请注意,您应该仅将`Release`配置用于基准测试。否则,结果将与现实不符。如果您忘记更改配置,BenchmarkDotNet将打印警告。 ![](https://img.tnblog.net/arcimg/hb/4c4c1fd04ccd4370b7156266827dd3b9.png) tn>然后我们通过`Ctrl+B`进行生成。并通过`Ctrl+F5`进行运行。 ![](https://img.tnblog.net/arcimg/hb/e911bc7cdaf245e29f99678a582de481.png) tn>从中我们发现Md5所消耗的时间比Sha256所需要的时间要短一些,接着我们添加内存特性查看使用的内存情况 ```csharp [MemoryDiagnoser] [SimpleJob] public class Md5VsSha256 { private const int N = 10000; private readonly byte[] data; private readonly SHA256 sha256 = SHA256.Create(); private readonly MD5 md5 = MD5.Create(); public Md5VsSha256() { data = new byte[N]; new Random(42).NextBytes(data); } [Benchmark] public byte[] Sha256() => sha256.ComputeHash(data); [Benchmark] public byte[] Md5() => md5.ComputeHash(data); } ``` tn>在`Ctrl+B`生成后,通过`Ctrl+F5`进行测试。 ![](https://img.tnblog.net/arcimg/hb/a6b404ab7dc4480894fa043c3a4682dd.png) tn>我们可以发现MD5比Sha256方法所占用的内存也要小一些。 Params参数 ------------ >您可以通过属性在类中标记一个或多个字段或`[Params]`属性。在此属性中,您可以指定一组值。每个值都必须是一个编译时常量。您将获得每种参数值组合的结果。 ```csharp [MemoryDiagnoser] [SimpleJob] public class Md5VsSha256 { /// <summary> /// 定义一个OneParams变量测试当它值为one和two时,Sha256方法与Md5方法的基准测试 /// </summary> [Params("one","two")] public string OneParams { get; set; } private const int N = 10000; private readonly byte[] data; private readonly SHA256 sha256 = SHA256.Create(); private readonly MD5 md5 = MD5.Create(); public Md5VsSha256() { data = new byte[N]; new Random(42).NextBytes(data); } [Benchmark] public byte[] Sha256() => sha256.ComputeHash(data); [Benchmark] public byte[] Md5() => md5.ComputeHash(data); } ``` ![](https://img.tnblog.net/arcimg/hb/b96711b3447a4007a8e6c4f89b246aae.png) 更多请参考官方文档 ------------ >https://benchmarkdotnet.org/articles/overview.html https://benchmarkdotnet.org/ 其他 ------------ ```csharp // 如果要导出不同格式的图表,请安装R语言并配置好环境变量,参考:https://blog.csdn.net/beauty0522/article/details/82560024 [AsciiDocExporter,CsvExporter,RPlotExporter,PlainExporter] [MaxColumn,MinColumn,MemoryDiagnoser] [SimpleJob] ```