BenchmarkDotNet性能测试

BenchmarkDotNet是一款开源的性能测试工具,使用方式非常简单,特别是对实现同一功能的两种方式,犹豫不决时,可以使用它进行个对比。

比如我们比较ADO.NET方式查询数据库表,和用Dapper方式获取数据为表,只需要在两个方法上增加 [Benchmark]就可以了,然后调用var summary = BenchmarkRunner.Run<Cycle>();就实现了性能测试。

using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Security.Cryptography;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Dapper;namespace MyBenchmarks
{public class Product{public string Name { get; set; }public string ProductNumber { get; set; }public bool MakeFlag { get; set; }public bool FinishedGoodsFlag { get; set; }public string Color { get; set; }public short SafetyStockLevel { get; set; }public short ReorderPoint { get; set; }public decimal StandardCost { get; set; }public decimal ListPrice { get; set; }public string Size { get; set; }public string SizeUnitMeasureCode { get; set; }public string WeightUnitMeasureCode { get; set; }public double Weight { get; set; }public int DaysToManufacture { get; set; }public string ProductLine { get; set; }public string Class { get; set; }public string Style { get; set; }public int ProductSubcategoryID { get; set; }public int ProductModelID { get; set; }public DateTime SellStartDate { get; set; }public DateTime SellEndDate { get; set; }public DateTime DiscontinuedDate { get; set; }public Guid rowguid { get; set; }public DateTime ModifiedDate { get; set; }}public class Cycle{[Benchmark]public void DapperTest(){var conn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2016;Persist Security Info=True;User ID=sa;password=sa;");var table = conn.Query<Product>("select top 100 * from production.product");}[Benchmark]public void CommandTest(){var conn = "Data Source=.;Initial Catalog=AdventureWorks2016;Persist Security Info=True;User ID=sa;password=sa;";var sql = "select top 100 * from production.product";var dapp = new SqlDataAdapter(sql, conn);var table = new DataTable();dapp.Fill(table);}}public class Program{public static void Main(string[] args){var summary = BenchmarkRunner.Run<Cycle>();}}
}

运行一下看一下结果,为了减少篇幅,删除了一些结果,从结果看出,为了得到较为客观的性能测试结果,BenchmarkDotNet还是做了很多工作的:

OverheadJitting,WorkloadJitting,WorkloadPilot,OverheadWarmup,OverheadActual,WorkloadWarmup,WorkloadActual,WorkloadResult。

并且通过最后的一个表格,清楚的给出了结果。同时还给出了Warnings ,以供参考。

// Validating benchmarks:
// ***** BenchmarkRunner: Start   *****
// ***** Found 2 benchmark(s) in total *****
// ***** Building 1 exe(s) in Parallel: Start   *****
// start dotnet restore  /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true in C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\BenchmarkDotNet\Demo01\bin\Release\net6.0\03bf0209-ac26-4de1-b763-4ba03e46cf4d
// command took 2.83s and exited with 0
// start dotnet build -c Release  --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true in C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\BenchmarkDotNet\Demo01\bin\Release\net6.0\03bf0209-ac26-4de1-b763-4ba03e46cf4d
// command took 4.29s and exited with 0
// ***** Done, took 00:00:07 (7.52 sec)   *****
// Found 2 benchmarks:
//   Cycle.DapperTest: DefaultJob
//   Cycle.CommandTest: DefaultJob// **************************
// Benchmark: Cycle.DapperTest: DefaultJob
// *** Execute ***
// Launch: 1 / 1
// Execute: dotnet "03bf0209-ac26-4de1-b763-4ba03e46cf4d.dll" --benchmarkName "MyBenchmarks.Cycle.DapperTest" --job "Default" --benchmarkId 0 in C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\BenchmarkDotNet\Demo01\bin\Release\net6.0\03bf0209-ac26-4de1-b763-4ba03e46cf4d\bin\Release\net6.0
// BeforeAnythingElse// Benchmark Process Environment Information:
// Runtime=.NET 6.0.0 (6.0.21.25307), X64 RyuJIT
// GC=Concurrent Workstation
// Job: DefaultJobOverheadJitting  1: 1 op, 229700.00 ns, 229.7000 us/op
WorkloadJitting  1: 1 op, 410021000.00 ns, 410.0210 ms/opWorkloadWarmup   1: 1 op, 4581600.00 ns, 4.5816 ms/op
WorkloadWarmup   2: 1 op, 746500.00 ns, 746.5000 us/op
WorkloadWarmup   3: 1 op, 830000.00 ns, 830.0000 us/op
WorkloadWarmup   4: 1 op, 822900.00 ns, 822.9000 us/op
WorkloadWarmup   5: 1 op, 741800.00 ns, 741.8000 us/op
WorkloadWarmup   6: 1 op, 746900.00 ns, 746.9000 us/op
WorkloadWarmup   7: 1 op, 826300.00 ns, 826.3000 us/op
WorkloadWarmup   8: 1 op, 698300.00 ns, 698.3000 us/op// BeforeActualRun
WorkloadActual   1: 1 op, 755100.00 ns, 755.1000 us/op
……
WorkloadActual  100: 1 op, 712700.00 ns, 712.7000 us/op// AfterActualRun
WorkloadResult   1: 1 op, 755100.00 ns, 755.1000 us/op
……
WorkloadResult  95: 1 op, 712700.00 ns, 712.7000 us/op// AfterAll
// Benchmark Process 26724 has exited with code 0Mean = 753.054 us, StdErr = 11.687 us (1.55%), N = 95, StdDev = 113.909 us
Min = 578.400 us, Q1 = 668.600 us, Median = 734.900 us, Q3 = 798.800 us, Max = 1,052.600 us
IQR = 130.200 us, LowerFence = 473.300 us, UpperFence = 994.100 us
ConfidenceInterval = [713.353 us; 792.754 us] (CI 99.9%), Margin = 39.701 us (5.27% of Mean)
Skewness = 0.87, Kurtosis = 2.93, MValue = 3.63// **************************
// Benchmark: Cycle.CommandTest: DefaultJob
// *** Execute ***
// Launch: 1 / 1
// Execute: dotnet "03bf0209-ac26-4de1-b763-4ba03e46cf4d.dll" --benchmarkName "MyBenchmarks.Cycle.CommandTest" --job "Default" --benchmarkId 1 in C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\BenchmarkDotNet\Demo01\bin\Release\net6.0\03bf0209-ac26-4de1-b763-4ba03e46cf4d\bin\Release\net6.0
// BeforeAnythingElse// Benchmark Process Environment Information:
// Runtime=.NET 6.0.0 (6.0.21.25307), X64 RyuJIT
// GC=Concurrent Workstation
// Job: DefaultJobOverheadJitting  1: 1 op, 215400.00 ns, 215.4000 us/op
WorkloadJitting  1: 1 op, 339247500.00 ns, 339.2475 ms/opWorkloadWarmup   1: 1 op, 3680100.00 ns, 3.6801 ms/op
WorkloadWarmup   2: 1 op, 943000.00 ns, 943.0000 us/op
WorkloadWarmup   3: 1 op, 875200.00 ns, 875.2000 us/op
WorkloadWarmup   4: 1 op, 982500.00 ns, 982.5000 us/op
WorkloadWarmup   5: 1 op, 956900.00 ns, 956.9000 us/op
WorkloadWarmup   6: 1 op, 1030800.00 ns, 1.0308 ms/op
WorkloadWarmup   7: 1 op, 1170900.00 ns, 1.1709 ms/op
WorkloadWarmup   8: 1 op, 1169400.00 ns, 1.1694 ms/op// BeforeActualRun
WorkloadActual   1: 1 op, 975400.00 ns, 975.4000 us/op
……
WorkloadActual  100: 1 op, 897400.00 ns, 897.4000 us/op// AfterActualRun
WorkloadResult   1: 1 op, 975400.00 ns, 975.4000 us/op
……
WorkloadResult  91: 1 op, 897400.00 ns, 897.4000 us/op// AfterAll
// Benchmark Process 17300 has exited with code 0Mean = 951.263 us, StdErr = 13.676 us (1.44%), N = 91, StdDev = 130.465 us
Min = 759.300 us, Q1 = 864.000 us, Median = 912.900 us, Q3 = 1,004.600 us, Max = 1,316.000 us
IQR = 140.600 us, LowerFence = 653.100 us, UpperFence = 1,215.500 us
ConfidenceInterval = [904.736 us; 997.789 us] (CI 99.9%), Margin = 46.526 us (4.89% of Mean)
Skewness = 0.95, Kurtosis = 3.05, MValue = 2.44// ***** BenchmarkRunner: Finish  *****// * Export *BenchmarkDotNet.Artifacts\results\MyBenchmarks.Cycle-report.csvBenchmarkDotNet.Artifacts\results\MyBenchmarks.Cycle-report-github.mdBenchmarkDotNet.Artifacts\results\MyBenchmarks.Cycle-report.html// * Detailed results *
Cycle.DapperTest: DefaultJob
Runtime = .NET 6.0.0 (6.0.21.25307), X64 RyuJIT; GC = Concurrent Workstation
Mean = 753.054 us, StdErr = 11.687 us (1.55%), N = 95, StdDev = 113.909 us
Min = 578.400 us, Q1 = 668.600 us, Median = 734.900 us, Q3 = 798.800 us, Max = 1,052.600 us
IQR = 130.200 us, LowerFence = 473.300 us, UpperFence = 994.100 us
ConfidenceInterval = [713.353 us; 792.754 us] (CI 99.9%), Margin = 39.701 us (5.27% of Mean)
Skewness = 0.87, Kurtosis = 2.93, MValue = 3.63
-------------------- Histogram --------------------
[  545.635 us ;   582.035 us) | @
[  582.035 us ;   650.935 us) | @@@@@@@@@@@@@@@
[  650.935 us ;   726.135 us) | @@@@@@@@@@@@@@@@@@@@@@@@@@@
[  726.135 us ;   791.665 us) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@
[  791.665 us ;   852.365 us) | @@@@@@@@
[  852.365 us ;   924.365 us) | @@@
[  924.365 us ; 1,009.685 us) | @@@@@@@@@@@
[1,009.685 us ; 1,085.365 us) | @@
---------------------------------------------------Cycle.CommandTest: DefaultJob
Runtime = .NET 6.0.0 (6.0.21.25307), X64 RyuJIT; GC = Concurrent Workstation
Mean = 951.263 us, StdErr = 13.676 us (1.44%), N = 91, StdDev = 130.465 us
Min = 759.300 us, Q1 = 864.000 us, Median = 912.900 us, Q3 = 1,004.600 us, Max = 1,316.000 us
IQR = 140.600 us, LowerFence = 653.100 us, UpperFence = 1,215.500 us
ConfidenceInterval = [904.736 us; 997.789 us] (CI 99.9%), Margin = 46.526 us (4.89% of Mean)
Skewness = 0.95, Kurtosis = 3.05, MValue = 2.44
-------------------- Histogram --------------------
[  721.230 us ;   780.280 us) | @@
[  780.280 us ;   860.730 us) | @@@@@@@@@@@@@@@@@@@@
[  860.730 us ;   936.870 us) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[  936.870 us ; 1,020.120 us) | @@@@@@@@@@@@@@@@
[1,020.120 us ; 1,080.630 us) | @@@@@
[1,080.630 us ; 1,170.980 us) | @@@@@@@
[1,170.980 us ; 1,247.120 us) | @@@@@@@@
[1,247.120 us ; 1,277.930 us) |
[1,277.930 us ; 1,354.070 us) | @
---------------------------------------------------// * Summary *BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
.NET SDK=6.0.100-preview.4.21255.9[Host]     : .NET 6.0.0 (6.0.21.25307), X64 RyuJIT  [AttachedDebugger]DefaultJob : .NET 6.0.0 (6.0.21.25307), X64 RyuJIT|      Method |     Mean |    Error |   StdDev |   Median |
|------------ |---------:|---------:|---------:|---------:|
|  DapperTest | 753.1 us | 39.70 us | 113.9 us | 734.9 us |
| CommandTest | 951.3 us | 46.53 us | 130.5 us | 912.9 us |// * Warnings *
MultimodalDistributionCycle.DapperTest: Default -> It seems that the distribution is bimodal (mValue = 3.63)
EnvironmentSummary -> Benchmark was executed with attached debugger
MinIterationTimeCycle.DapperTest: Default  -> The minimum observed iteration time is 578.4000 us which is very small. It's recommended to increase it to at least 100.0000 ms using more operations.Cycle.CommandTest: Default -> The minimum observed iteration time is 759.3000 us which is very small. It's recommended to increase it to at least 100.0000 ms using more operations.// * Hints *
OutliersCycle.DapperTest: Default  -> 5 outliers were removed (1.06 ms..2.17 ms)Cycle.CommandTest: Default -> 9 outliers were removed (1.37 ms..2.51 ms)// * Legends *Mean   : Arithmetic mean of all measurementsError  : Half of 99.9% confidence intervalStdDev : Standard deviation of all measurementsMedian : Value separating the higher half of all measurements (50th percentile)1 us   : 1 Microsecond (0.000001 sec)// ***** BenchmarkRunner: End *****
// ** Remained 0 benchmark(s) to run **
Run time: 00:00:03 (3.12 sec), executed benchmarks: 2Global total time: 00:00:10 (10.65 sec), executed benchmarks: 2
// * Artifacts cleanup *

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一笑 | 程序员的日常,这也太真实了......

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

【转载】分布式系统的理解

2019独角兽企业重金招聘Python工程师标准>>> 1. 如何理解“分布式”&#xff1f; 经常听到”分布式系统“&#xff0c;”分布式计算“&#xff0c;”分布式算法“。分布式的具体含义是什么&#xff1f;狭义的分布是指&#xff0c;指多台PC在地理位置上分布在不同的…

小米开招.NET,20~40k*16薪,点名要求WPF+自动化!

近期小米发布了深圳南山区的C#工程师招聘岗位&#xff0c;20~40k*14薪的待遇让人心动&#xff0c;其核心技术要求再WPF、MVVM、自动化设备、本地数据库等&#xff0c;有没有发现什么秘密&#xff1f;互联网造车&#xff01;物联网终极形态自今年3月份小米宣布要造车&#xff0c…

linux内核线程socket,从Linux源码看Socket(TCP)的accept

从Linux源码看Socket(TCP)的accept前言笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码&#xff0c;是一件Exciting的事情。 今天笔者就从Linux源码的角度看下Server端的Socket在进行Accept的时候到底作了哪些事情(基于Linux 3.10内核)。html一个最简单的Server端…

豆瓣最高评分8.9!让你拥有“多样性思维”

▲数据汪特别推荐点击上图进入玩酷屋01表象与本质我们的大脑是如何工作的&#xff1f;所谓的类比到底是什么?我们是怎么在截然不同的情景间建立起联系的&#xff1f;类比在学习的过程中发挥着怎样的作用&#xff1f;人类大脑中的每个概念都源于多年来不知不觉中形成的一长串类…

复仇!3:1 KO叙利亚!.NET程序员用算法推演出国足进世界杯概率...

6月16日凌晨2点&#xff0c;国足在阿联酋沙迦体育场迎战卡塔尔世预赛亚洲区40强赛最后一个对手&#xff0c;已经锁定小组头名并出线的劲敌叙利亚队&#xff0c;上半场艾克森中框&#xff0c;武磊送助攻&#xff0c;张稀哲打破僵局&#xff0c;下半场奥斯曼扳平比分&#xff0c;…

linux终端背景透明度设置,Ubuntu Terminal标签背景颜色设置

使用ubuntu以来一直苦于terminal标签颜色差距太小&#xff0c;有时候根本不知道自己在哪个标签下&#xff0c;于是在网上搜索如何设置背景颜色可以让标签便于区分&#xff0c;现总结如下&#xff1a;1.打开gtk-widgets.cssvim /usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.…

快速入门人工智能,这波福利不能错过!

不知不觉&#xff0c;寒假就这样溜走了&#xff0c;看着这个寒假养肥的膘&#xff0c;嗯~又是一个充实的假期。不少同学踏上返校之路&#xff0c;迎来新学期&#xff01;新学期&#xff0c;当然少不了小天的陪伴啦&#xff01;早春开学季&#xff0c;小天送福利&#xff0c;福利…

从代码角度揭示:华为鸿蒙的“套壳”真相!

华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;出来后&#xff0c;互联网上已经吵翻天了&#xff0c;有人认为HarmonyOS是“自主的全场景分布式系统”&#xff0c;是国产之光&#xff0c;另一派则认为HarmonyOS是“Android套壳”&#xff0c;是挂羊头卖狗肉。作为十年老程…

linux进化树分析的软件,一款好用的进化树可视化编辑软件

原标题&#xff1a;一款好用的进化树可视化编辑软件iTOL(Interactive Tree Of Life)是一个在线显示和操作的进化树工具。我们可以添加很多自定义的项目&#xff0c;丰富和完善自己的进化树&#xff0c;比如添加柱状图、蛋白结构域、heatmap、基因平行转移(horizontal gene tran…

每日一笑 | 床上还是桌上,你总得选一样~

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

Redis分布式锁抽丝剥茧

之前码甲哥写了两篇有关线程安全的文章&#xff1a;•你管这叫线程安全&#xff1f;•.NET八股文&#xff1a;线程同步技术解读分布式锁是"线程同步"的延续最近首度应用"分布式锁"&#xff0c;现在想想&#xff0c;分布式锁不是孤立的技能点&#xff0c;这…

让苹果CEO库克折服的程序员仅10岁!?

▲数据汪特别推荐点击上图进入玩酷屋在国外&#xff0c;编程教育课早已普及&#xff0c;美国、英国、新加坡等国家少儿编程已进入小学标准必修课程体系。韩国、日本也相继在2017年和2020年开展一年级至初三的编程教育普及。美国总统孙女&#xff0c;五岁开始学习在电脑上编程最…

WPF Datagrid合并表头的思路

在使用datagrid的时候&#xff0c;有很多情况下&#xff0c;都需要合并表头&#xff0c;多行表头之类的操作。这就需要我们自定义列了。本文给出一个思路&#xff0c;可以实现此需要&#xff0c;只是本人对这个研究不很明白&#xff0c;只是只是实现&#xff0c;仅此而已。下面…

C# 爬虫:疫情实时信息图

运行结果&#xff1a;using System; using System.Drawing; using System.Text; using NSoup; using NSoup.Nodes; using System.IO; using System.Net; using System.Text.RegularExpressions; using System.Windows.Forms;namespace Pneumonia {public partial class MainFor…

史上最黑科技 | 人造肌肉、DNA折叠、柔性外骨骼…

全世界只有3.14 % 的人关注了数据与算法之美说起被机器人支配&#xff0c;一部分人恐惧得不行&#xff0c;另一部人只当个笑话&#xff0c;但无论哪一边&#xff0c;都忍不住想看看这个神秘的领域正在发生什么&#xff0c;这是本能&#xff1a;“我得盯着你&#xff0c;如果哪天…

linux l显示详细信息,fdisk -l显示信息详解

fdisk -l显示信息详解[rootwww.linuxidc.com ~]# fdisk -lDisk /dev/sda: 10.7 GB, 10737418240 bytes255 heads, 63 sectors/track, 1305 cylindersUnits cylinders of 16065 * 512 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/o…

有钱真的能为所欲为,微软用75亿美元解决了比尔盖茨的“心头大患”

全世界只有3.14 % 的人关注了数据与算法之美2018年6月4日&#xff0c;微软在官方博客上宣布&#xff1a;以75 亿美元的价格收购了全球最大的开源代码托管平台GitHub。谁也没想到&#xff0c;微软和开源这场长达几十年的战争&#xff0c;到最后双方竟然喜结连理了。不过&#xf…

linux 逻辑卷 pe size 4.00 mib大小怎么改,linux逻辑卷的建立

开始的时候系统各目录的挂载情况如下&#xff1a;增加了一个8G大小的scsi磁盘启动系统之后。[rootpoint1 ~]#fdisk &#xfffd;Cl增加了一个sdb设别。一、分区并格式化磁盘[rootpoint1 ~]#fdisk /dev/sdb输入m是显示帮助菜单输入n创建一个分区&#xff0c;选择p创建主分区&…

svn 自动同步到web站点目录post-commit.bat

为什么80%的码农都做不了架构师&#xff1f;>>> 需求分析: 在服务器上搭建了visualSVN server &#xff0c;然后为了统一测试环境&#xff0c;又在服务器上搭建了web server。现在的需求是&#xff0c;当开发人员通过svn提交更新的时候&#xff0c;让svn自动将文件…