我的高级架构师告诉我,检验程序性能时不要用DateTime.Now相减或者StopWatch,最好用BenchmarkDotNet,于是我就试了一下。
上手体验后感觉BenchmarkDotNet大致的特点如下:

  1. 用起来还比较简单,在对应的method上面打上[Benchmark]标记即可;
  2. 通过var summary = BenchmarkRunner.Run();来启动;
  3. 要求class和method必须是public;
  4. 要求程序必须是Release;
  5. 会自动将程序中打标记的对应模块跑很多遍,最后给出均值和偏差;

使用前要在NuGet管理器中,或者在包管理器的PM终端中安装BenchmarkDotNet。

最后上代码(以测试SeriLog和原生StreamWriter的效率对比为例):

// See https://aka.ms/new-console-template for more information
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Serilog;
using Serilog.Core;SerilogTest.Program.main();namespace SerilogTest
{public class Program{Logger _log2Console = new LoggerConfiguration().WriteTo.Console().CreateLogger();Logger _log2File = new LoggerConfiguration().WriteTo.File("seri.log").CreateLogger();private StreamWriter _sw2File = new StreamWriter("sq.log");private int _loopMaxTime = 100;[Benchmark]public double Seri2ConsoleI(){DateTime tmpStartTime = System.DateTime.Now;for (int i = 1; i < _loopMaxTime; i++){_log2Console.Information($"Serilog info {i}");}Log.CloseAndFlush();DateTime tmpEndTime = System.DateTime.Now;TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);}[Benchmark]public double Seri2ConsoleE(){DateTime tmpStartTime = System.DateTime.Now;for (int i = 1; i < _loopMaxTime; i++){_log2Console.Error($"Serilog error {i}");}Log.CloseAndFlush();DateTime tmpEndTime = System.DateTime.Now;TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);}[Benchmark]public double Seri2FileI(){DateTime tmpStartTime = System.DateTime.Now;for (int i = 1; i < _loopMaxTime; i++){_log2File.Information($"Serilog info {i}");}Log.CloseAndFlush();DateTime tmpEndTime = System.DateTime.Now;TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);}[Benchmark]public double Seri2FileE(){DateTime tmpStartTime = System.DateTime.Now;for (int i = 1; i < _loopMaxTime; i++){_log2File.Error($"Serilog error {i}");}Log.CloseAndFlush();DateTime tmpEndTime = System.DateTime.Now;TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);}[Benchmark]public double Stream2File(){DateTime tmpStartTime = System.DateTime.Now;for (int i = 1; i < _loopMaxTime; i++){_sw2File.WriteLine($"{tmpStartTime.ToString()}.077 +08:00 [ERR] Stream Writer {i}");}_sw2File.Flush();DateTime tmpEndTime = System.DateTime.Now;TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);}[Benchmark]public double Stream2Console(){DateTime tmpStartTime = System.DateTime.Now;for (int i = 1; i < _loopMaxTime; i++){Console.WriteLine($"{tmpStartTime.ToString()}.077 +08:00 [ERR] Console Write {i}");}DateTime tmpEndTime = System.DateTime.Now;TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);}public static void main(){var summary = BenchmarkRunner.Run<Program>();/*double SeriConcolsErrorCost = Seri2ConsoleE();double SeriConcolsInfoCost = Seri2ConsoleI();double SeriFileErrorCost = Seri2FileE();double SeriFileInfoCost = Seri2FileI();double SystConsoleInfoCost = Stream2Console();double SystFileInfoCost = Stream2File();Console.WriteLine($"[To Console]:\n" +$"    Seri info: { SeriConcolsInfoCost }ms\n" +$"    Seri err: { SeriConcolsErrorCost }ms\n" +$"    Sys output: { SystConsoleInfoCost }ms\n" +$"[To file]:\n" +$"    Seri info: { SeriFileInfoCost }ms\n" +$"    Seri error: { SeriFileErrorCost }ms\n" +$"    Sys output: { SystFileInfoCost }ms\n");*/}}
}

运行结果如下:

结果日志也会保存在新生成的BenchmarkDotNet.Artifacts目录中。

BenchmarkDotNet的使用相关推荐

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

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用BenchmarkDotNet给C#程序做性能测试. 转载于:https://www.cnblogs. ...

  2. BenchmarkDotNet性能测试

    BenchmarkDotNet是一款开源的性能测试工具,使用方式非常简单,特别是对实现同一功能的两种方式,犹豫不决时,可以使用它进行个对比. 比如我们比较ADO.NET方式查询数据库表,和用Dappe ...

  3. 如何使用 BenchmarkDotNet 对 C# 代码进行基准测试

    BenchmarkDotNet 是一个轻量级,开源的,强大的 .NET 工具包,它可以将你的方法转化为基准并跟踪这些方法,最后对这些方法的性能提供一些测试报告,使用 BenchmarkDotNet 玩 ...

  4. BenchmarkDotNet v0.12x新增功能

    起因 在看.Net 官方博客 .Net 5性能优化 中,发现测试性能的BenchmarkDotNet版本已经是v0.12.1,然后去看BenchmarkDotNet文档,发现还是有不少新的特性. v0 ...

  5. 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

    事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...

  6. .NET Core中的性能测试工具BenchmarkDotnet

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

  7. 使用 BenchmarkDotnet 测试代码性能

    先来点题外话,清明节前把工作辞了(去 tm 的垃圾团队,各种拉帮结派.勾心斗角).这次找工作就得慢慢找了,不能急了,希望能找到个好团队,好岗位吧.顺便这段时间也算是比较闲,也能学习一下和填掉手上的坑. ...

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

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

  9. .Net性能测试工具BenchmarkDotnet

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

最新文章

  1. ATS日志格式中的Squid-和Netscape-格式的缓存结果码
  2. K3s初探:Rancher架构师带你尝鲜史上最轻量Kubernetes发行版
  3. 牛客网 华为机试题 数据重复的筛选问题记录
  4. 【计算理论】计算复杂性 ( 算法复杂度标记 | 渐进上界 | 大 O 记号 | 常用的渐进上界 )
  5. Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
  6. SpringBoot_入门-springboot-helloworld
  7. Sublime Text 2 中文包
  8. 使用代码获得所有适用于创建的transaction type
  9. visio画uml类图添加自定义数据类型
  10. 台式计算机驱动程序未被安装,电脑未能成功安装设备驱动程序怎么办
  11. jQuery Mobile基础 学习笔记
  12. 手机端放在线条中间的标题
  13. STC12C5A60S2获取GPS信息(LCD1602显示)(一)
  14. webworker应用场景_聊聊webWorker
  15. LeetCode 643 题解
  16. MATEBOOK E 2019 安装linux
  17. [235]scrapy分布式爬虫scrapy-redis(二)
  18. 随心,随性,随缘。注定让一生改变的,只在百年后,那一朵花开的时间…
  19. Android10.0,计步传感器(Sensor.TYPE_STEP_COUNTER) 无法计步
  20. 讯飞音乐识别python实现文件识别

热门文章

  1. oracle emp数据库或数据误删恢复
  2. Lync 2010迁移Lync 2013 PART6:迁移CMS
  3. jquery 地理位置 与 IP地址
  4. Java 数组中找最大值和最小值
  5. mysql把sql文件导入到数据库
  6. docker环境无法执行jmap -heap 56命令
  7. Windows Internals 笔记——关联性
  8. Hadoop单机/伪分布式集群搭建(新手向)
  9. Javascript 思维导图 绘制基础内容(值得一看)
  10. 配置 Keepalived + LVS-DR模式, 实现高可用和负载均衡