背景介绍

之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下BenchmarkDotNet。

原文链接:https://dotnetcoretutorials.com/2017/12/04/benchmarking-net-core-code-benchmarkdotnet/

为什么需要性能基准测试?

性能基准测试可以帮助程序员对比2个代码段或者方法的性能,这对于代码重写或者重构来说,可以提供一种很好的量化标准。如果没有性能基准测试,很难想象将方法A改为B方法时候,仅凭肉眼如何区分性能的变化。

BenchmarkDotNet

BenchmarkDotNet是一款强力的.NET性能基准测试库, 官网https://benchmarkdotnet.org/。

运行时支持

  • NET Framework (4.6+),

  • .NET Core (2.0+)

  • Mono

  • CoreRT。

BenchmarkDotnet为每个被测试的方法提供了孤立的环境, 使用BenchmarkDotnet, 程序员可以很容易的编写各种性能测试方法,并可以避免许多常见的坑。

代码基准测试(Code Benchmarking)

现在我们希望来对比一下Linq to object中First和Single方法的性能

虽然我们知道First的性能肯定比Single高, First方法会在查询到第一个满足条件的对象之后就停止集合遍历,而Single找到第一个满足条件的对象之后,不会停止查找,它会去继续查找集合中的剩余对象,直到遍历整个集合或者在集合中找到第二个匹配条件的对象。 这里我们只是为了演示一下如何进行代码基准测试。

为了使用BenchmarkDotNet来进行代码基准测试,我们首先创建一个空的.Net Core控制台程序。

然后我们使用Package Manage Console添加BenchmarkDotNet库

PM> Install-Package BenchmarkDotNet

然后我们修改Program.cs文件, 代码如下

代码解释说明

  • 以上代码中SingleVsFirst类是一个测试类。

  • 测试类中我们生成了一个拥有100万对象的字符串集合。

  • 我们在集合的中间位置插入了一个测试字符串,字符串的内容是"needle"。

  • 代码中的SingleFirst方法,分别调用了Linq to object的SingleOrDefaultFirstOrDefault方法来查询字符串集合中的"needle"字符串。

  • SingleFirst方法上,我们加入[Benchmark]特性, 拥有该特性的方法会出现在最后的基准检测报告中。

注意:

  • 测试的方法必须是公开的(public), 如果把public去掉,程序不会产生任何结果

  • 在运行程序之前,还有一步关键的操作,测试的程序需要使用Release模式编译,并且不能附加任何调试器(Debugger)

最终结果

现在我们运行程序,程序产生的最终报告如下

Method  |     Mean |     Error |   StdDev |   Median |
------- |---------:|----------:|---------:|---------:|Single | 28.12 ms | 0.9347 ms | 2.697 ms | 28.93 ms |First | 13.30 ms | 0.8394 ms | 2.475 ms | 14.48 ms |

结果中的第一列Mean表明了2个方法处理的平均响应时间,FirstSingle快了一倍(这和我们测试字符串放置的位置有关系)。

带测试参数的基准测试(Input Benchmarking)

BenchmarkDotNet中我们还可以使用[ParamsSource]参数来指定测试的用例范围。
在上面的代码中,我们测试了匹配字符串在集合中间位置时,FirstSingle的效率对比,下面我们修改上面的代码,我们希望分别测试匹配字符串在集合头部,尾部以及中间位置时FirstSingle的效率对比。

代码解释说明

  • 我们创建了测试的用例字符串集合_needles

  • 在构造函数中,我们在字符串集合的头部,中部,尾部分别插入了3个字符串

  • 我们添加了一个属性Needle, 表示当前测试的用例,在被测试SingleFirst方法中,我们使用属性Needle来匹配

  • 在属性Needle上我们加上了参数来源特性[ParamsSource], 并设置参数来源是_needles

最终效果

现在我们运行程序,程序产生的最终报告如下

 Method |       Needle |             Mean |          Error |           StdDev |           Median |------- |------------- |-----------------:|---------------:|-----------------:|-----------------:|Single |    EndNeedle | 23,266,757.53 ns | 432,206.593 ns |   591,609.263 ns | 23,236,343.07 ns |First |    EndNeedle | 24,984,621.12 ns | 494,223.345 ns |   783,890.599 ns | 24,936,945.21 ns |Single | MiddleNeedle | 21,379,814.14 ns | 806,253.579 ns | 2,377,256.870 ns | 22,436,101.14 ns |First | MiddleNeedle | 11,984,519.09 ns | 315,184.021 ns |   924,380.173 ns | 12,233,700.94 ns |Single |  StartNeedle | 23,650,243.23 ns | 599,968.173 ns |   714,219.431 ns | 23,555,402.19 ns |First |  StartNeedle |         89.17 ns |       1.864 ns |         2.732 ns |         89.07 ns

从结果上看

  • 当匹配字符串在集合头部的时候,First性能比Single高的多

  • 当匹配字符串在集合中部的时候,First性能是比Single的一倍

  • 当匹配字符串在集合尾部的时候,First和比Single的性能差不多

加入内存测试

在.NET Core中的CSV解析库中,我们使用了以下代码

其中除了[Benchmark]特性,我们还在测试类CsvBenchmarking上添加了[MemoryDiagnoser]特性,该特性会在测试报告中追加,2个方法执行时的内存使用情况。

        Method |       Mean | Scaled | Allocated |-------------- |-----------:|-------:|----------:|CSVHelper | 1,404.5 ms |   1.00 | 244.39 MB |TinyCsvParser |   381.6 ms |   0.27 |  32.53 MB |

其中Allocated表明了内存占用情况。

总结

BenchmarkDotNet绝对是.NET开发人员了解代码性能,以及对比代码性能的必备神器。你的项目里用了BenchmarkDotnet了么?

相关文章:

  • 使用 BenchmarkDotnet 测试代码性能

  • .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

  • 用BenchmarkDotNet给C#程序做性能测试

原文地址:https://www.cnblogs.com/lwqlun/p/9671611.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.NET Core中的性能测试工具BenchmarkDotnet相关推荐

  1. .Net性能测试工具BenchmarkDotnet

    性能基准测试可以帮助程序员对比2个代码段或者方法的性能,这对于代码重写或者重构来说,可以提供一种很好的量化标准.如果没有性能基准测试,很难想象将方法A改为B方法时候,仅凭肉眼如何区分性能的变化. Be ...

  2. 作为软件测试人员,这些常用的性能测试工具你一定要知道

    软件测试是一种促进鉴定软件的正确性.完整性.安全性和质量的活动过程,性能测试作为软件测试工作中的重要部分,通过自动化测试工具来模拟多种正常.峰值以及异常负债环境来对系统进行各项性能指标的测试,那么在性 ...

  3. .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

    .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono. BenchmarkDotNet支持 C# ...

  4. Asp.net core中Migration工具使用的交流分享

    一.文章参数 开发工具: visual studio 2015 community update 3 + .net core tools(preview2) + sqlserver2012 expre ...

  5. ASP.NET Core WebAPI中的分析工具MiniProfiler

    安装 我们可以使用Nuget来下载这个包. PM> Install-Package MiniProfiler.AspNetCore.Mvc 配置Startup.cs MiniProfiler配置 ...

  6. Webapi管理和性能测试工具WebBenchmark

    WebBenchmark是一款基于开源通讯组件Beetlex扩展的Webapi管理和性能测试工具,在传统工具中一般管理工具缺乏性能压测能力或有性能压测的缺少管理功能:WebBenchmark的设计目标 ...

  7. linux webapi测试,Webapi管理和性能测试工具WebBenchmark

    WebBenchmark是一款基于开源通讯组件Beetlex扩展的Webapi管理和性能测试工具,在传统工具中一般管理工具缺乏性能压测能力或有性能测试的缺少管理功能:WebBenchmark的设计目标 ...

  8. Linux 性能测试工具 sysbench 的安装与简单使用

    Linux 性能测试工具 sysbench 的安装与简单使用 一 背景 sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. sysbench 支 ...

  9. Linux 性能测试工具 sysbench 的安装与简单使用 1

    文章目录 Linux 性能测试工具 sysbench 的安装与简单使用 一 背景 二 实验环境 2.1 操作系统 2.2 其他配置 三 安装 四 简单使用过程 4.1 查看软件版本 4.2 查看系统帮 ...

最新文章

  1. Redis的集群模式
  2. HBase Filter及对应Shell--转
  3. href 和 src 的区别
  4. Remoting系列专题---构建Remoting“防火墙”
  5. LightOJ 1096 - nth Term 矩阵快速幂
  6. VMware vCenter Server 的内部版本号和版本 (2143838)
  7. rsyslog-mysql_04-Log rsyslog-mysql loganalyzer
  8. 使用 Linux下 timerfd 系列 API 创建定时器并使用 epoll 监听
  9. 解决 Eclipse不支持tomcat9
  10. 设计模式-行为型软件设计模式(四)
  11. 【英语学习】【WOTD】feisty 释义/词源/示例
  12. win10共享打印机 报错 709 57
  13. 生死看淡,不服就干!我预言这套Java视频必火
  14. sybase 快速删除大数据库的手顺方法
  15. Effective Approaches to Attention-based Neural Machine Translation
  16. 团队作业-Beta冲刺(3)
  17. 杭电2015‘11校赛 1007油菜花王国
  18. Python3下的NLTK及nltk_data安装问题(Ubuntu环境)
  19. Tarena - 分组查询
  20. 华为ap WA131SN-NZ设置胖ap开启wifi无线网络

热门文章

  1. Python之路【第一篇】:环境搭建
  2. ios之UISplitViewController
  3. socket编程资料-网络收集
  4. 在非k8s 环境下 的应用 使用 Dapr Sidekick for .NET
  5. 一起来庆祝 .NET 20 周年!
  6. NET问答: 是否有通用的方法判断一个 Type 是 Number ?
  7. 来,Consul 服务发现入个门(一看就会的那种)
  8. 腾讯招.NET5,居然要求精通MySQL,而不是SQLServer!
  9. asp.net core 使用 TestServer 来做集成测试
  10. 为啥 Response.Write 后,View就不渲染了?