BenchmarkDotNet的使用
我的高级架构师告诉我,检验程序性能时不要用DateTime.Now相减或者StopWatch,最好用BenchmarkDotNet,于是我就试了一下。
上手体验后感觉BenchmarkDotNet大致的特点如下:
- 用起来还比较简单,在对应的method上面打上[Benchmark]标记即可;
- 通过var summary = BenchmarkRunner.Run();来启动;
- 要求class和method必须是public;
- 要求程序必须是Release;
- 会自动将程序中打标记的对应模块跑很多遍,最后给出均值和偏差;
使用前要在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的使用相关推荐
- 用BenchmarkDotNet给C#程序做性能测试
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用BenchmarkDotNet给C#程序做性能测试. 转载于:https://www.cnblogs. ...
- BenchmarkDotNet性能测试
BenchmarkDotNet是一款开源的性能测试工具,使用方式非常简单,特别是对实现同一功能的两种方式,犹豫不决时,可以使用它进行个对比. 比如我们比较ADO.NET方式查询数据库表,和用Dappe ...
- 如何使用 BenchmarkDotNet 对 C# 代码进行基准测试
BenchmarkDotNet 是一个轻量级,开源的,强大的 .NET 工具包,它可以将你的方法转化为基准并跟踪这些方法,最后对这些方法的性能提供一些测试报告,使用 BenchmarkDotNet 玩 ...
- BenchmarkDotNet v0.12x新增功能
起因 在看.Net 官方博客 .Net 5性能优化 中,发现测试性能的BenchmarkDotNet版本已经是v0.12.1,然后去看BenchmarkDotNet文档,发现还是有不少新的特性. v0 ...
- 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能
事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...
- .NET Core中的性能测试工具BenchmarkDotnet
背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...
- 使用 BenchmarkDotnet 测试代码性能
先来点题外话,清明节前把工作辞了(去 tm 的垃圾团队,各种拉帮结派.勾心斗角).这次找工作就得慢慢找了,不能急了,希望能找到个好团队,好岗位吧.顺便这段时间也算是比较闲,也能学习一下和填掉手上的坑. ...
- .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono
.NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono. BenchmarkDotNet支持 C# ...
- .Net性能测试工具BenchmarkDotnet
性能基准测试可以帮助程序员对比2个代码段或者方法的性能,这对于代码重写或者重构来说,可以提供一种很好的量化标准.如果没有性能基准测试,很难想象将方法A改为B方法时候,仅凭肉眼如何区分性能的变化. Be ...
最新文章
- ATS日志格式中的Squid-和Netscape-格式的缓存结果码
- K3s初探:Rancher架构师带你尝鲜史上最轻量Kubernetes发行版
- 牛客网 华为机试题 数据重复的筛选问题记录
- 【计算理论】计算复杂性 ( 算法复杂度标记 | 渐进上界 | 大 O 记号 | 常用的渐进上界 )
- Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
- SpringBoot_入门-springboot-helloworld
- Sublime Text 2 中文包
- 使用代码获得所有适用于创建的transaction type
- visio画uml类图添加自定义数据类型
- 台式计算机驱动程序未被安装,电脑未能成功安装设备驱动程序怎么办
- jQuery Mobile基础 学习笔记
- 手机端放在线条中间的标题
- STC12C5A60S2获取GPS信息(LCD1602显示)(一)
- webworker应用场景_聊聊webWorker
- LeetCode 643 题解
- MATEBOOK E 2019 安装linux
- [235]scrapy分布式爬虫scrapy-redis(二)
- 随心,随性,随缘。注定让一生改变的,只在百年后,那一朵花开的时间…
- Android10.0,计步传感器(Sensor.TYPE_STEP_COUNTER) 无法计步
- 讯飞音乐识别python实现文件识别