BenchmarkDotNet性能测试
DotNetCore实战
共 11693字,需浏览 24分钟
· 2021-06-16
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: DefaultJob
OverheadJitting 1: 1 op, 229700.00 ns, 229.7000 us/op
WorkloadJitting 1: 1 op, 410021000.00 ns, 410.0210 ms/op
WorkloadWarmup 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 0
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
**************************
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: DefaultJob
OverheadJitting 1: 1 op, 215400.00 ns, 215.4000 us/op
WorkloadJitting 1: 1 op, 339247500.00 ns, 339.2475 ms/op
WorkloadWarmup 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 0
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
***** BenchmarkRunner: Finish *****
* Export *
BenchmarkDotNet.Artifacts\results\MyBenchmarks.Cycle-report.csv
BenchmarkDotNet.Artifacts\results\MyBenchmarks.Cycle-report-github.md
BenchmarkDotNet.Artifacts\results\MyBenchmarks.Cycle-report.html
* Detailed results *
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) | @@@@@@@@@@@
us ; 1,085.365 us) | @@
---------------------------------------------------
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) | @@@@@@@@@@@@@@@@
us ; 1,080.630 us) | @@@@@
us ; 1,170.980 us) | @@@@@@@
us ; 1,247.120 us) | @@@@@@@@
us ; 1,277.930 us) |
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
SDK=6.0.100-preview.4.21255.9
.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 *
MultimodalDistribution
Default -> It seems that the distribution is bimodal (mValue = 3.63) :
Environment
Summary -> Benchmark was executed with attached debugger
MinIterationTime
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. :
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 *
Outliers
Default -> 5 outliers were removed (1.06 ms..2.17 ms) :
Default -> 9 outliers were removed (1.37 ms..2.51 ms) :
* Legends *
Mean : Arithmetic mean of all measurements
Error : Half of 99.9% confidence interval
StdDev : Standard deviation of all measurements
Median : 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: 2
Global total time: 00:00:10 (10.65 sec), executed benchmarks: 2
// * Artifacts cleanup *
.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
【.NET Core微服务实战-统一身份认证】开篇及目录索引
Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
用abp vNext快速开发Quartz.NET定时任务管理界面
评论
测试新人,如何快速上手一个陌生的系统!
大家好,我是狂师!作为刚入行不久的测试新人,面对一个陌生的系统时,可能会感到有些手足无措。面对一个全新的系统系统,如何快速上手并展开有效的测试工作是一个重要的挑战。本文将探讨测试新人如何通过一系列步骤和策略,快速熟悉并掌握新系统的测试要点,从而提高测试效率和质量。本文旨在为测试新手提供一份指导,帮助
测试开发技术
0
APP 安全测试项总结
一、安装包测试 1.1、关于反编译 目的是为了保护公司的知识产权和安全方面的考虑等,一些程序开发人员会在源码中硬编码一些敏感信息,如密码。而且若程序内部一些设计欠佳的逻辑,也可能隐含漏洞,一旦源码泄漏,安全隐患巨大。 为了避免这些问题,除了代码审核外,通常开发的做法是对代码进行混淆,混淆后源代
测试开发技术
0
自动化测试做得好的标准是什么
自动化测试要做得好的标准,主要包括以下几个方面:一、高覆盖率与精准定位1、测试用例覆盖全面:自动化测试应覆盖产品的核心功能、关键业务流程以及常见的异常场景,确保测试范围广泛,降低遗漏风险。2、问题定位准确:自动化测试应能够精准地识别并定位问题,包括缺陷的位置、产生的原因以及可能的影响,为开发团队提供
测试开发社区
0
Vite 4.3 为何性能爆表?
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群Vite 4.3 相比 Vite 4.2 取得了惊人的性能提升,下面和大家分享一下 Vite 4.3 性能大幅提升的幕后技术细节,深度阅读,全程高能
程序员成长指北
0
【性能监控】如何有效监测网页静态资源大小?
前言作为前端人员肯定经常遇到这样的场景:需求刚上线,产品拿着手机来找你,为什么页面打开这么慢呀,心想自己开发的时候也有注意性能问题呀,不可能会这么夸张。那没办法只能排查下是哪一块影响了页面的整体性能,打开浏览器控制台一看,页面上的这些配图每张都非常大,心想这些配图都这么大,页面怎么快,那么我们有没有
高级前端进阶
0
Linux系统性能优化:七个实战经验
来源公众号:twt社区IT社区原文链接:https://mp.weixin.qq.com/s/Rey0gSnnj-zoAEwE6J-GjwLinux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个w
开源Linux
1
21.3K star!推荐一款可视化自动化测试/爬虫/数据采集神器!功能免费且强大!
【温馨提示】由于公众号更改了推送规则,不再按照时间顺序排列,如果不想错过测试开发技术精心准备的的干货文章,请将测试开发技术设为“星标☆”,看完文章在文尾处点亮“在看”!大家好,我是狂师!在大数据时代,信息的获取与分析变得尤为重要。对于开发者、数据分析师乃至非技术人员来说,能够高效地采集网络数据并进行
测试开发技术
4
漫游CPU缓存效应,让你的程序性能飙升!
推荐一个原创技术号-非科班大厂码农,号主是机械专业转行进入腾讯的后端程序员!大多数读者都知道cache是一种快速小型的内存,用以存储最近访问内存位置。这种描述合理而准确,但是更多地了解一些处理器缓存工作中的“烦人”细节对于理解程序运行性能有很大帮助。在这篇博客中,我将运用代码示例来详解 cache工
码农有道公众号
1