项目中需要用到性能测试,发现.net 平台的这个神器. 觉得很不错,接下来准备做个系列。具体参考官方介绍
做基线对比测试不是那么容易,你很容易就翻车掉坑里,BenchmarkDotNet 会帮你避坑(即使你是老司机),它会帮你干很多体力活,比如它会针对每个benchmark方法生成独立的工程项目,并启动这些单独的工程,迭代多次运行benchmark方法(包括测试前的热身)等。通常,你不需要关注这些benchmark方法的迭代次数,BenchmarkDotNet 会根据它的经验选中合适的迭代次数。
有了BenchmarkDotNet,做性能对比测试就非常容易了,只需要把你的测试方法加上特性[Benchmark], 想做不同.net平台的性能测试,比如传统的 .NET Framework, .NET Core, and Mono,这些都没问题,加一个特性就会把面向不同平台的测试工程生成出来,随后运行后将会生成不同平台的性能对比结果。可以这么说,它可以测试对比任何不同的测试环境,比如 不同的处理器架构(x86/x64)、不同的JIT编译器(LegacyJIT/RyuJIT)、不同的垃圾回收机制(如服务器/工作站),除此之外,同时还可以引入不同的输入参数(一个或者几个),对比其它条件相同而参数不同时候的性能对比。
BenchmarkDotNet 不仅仅是帮你运行benchmark方法,还帮你分析生成的结果:它会生成不同形式的报表,它的结果报表都是统计分析出来的,它不会一下子给你很多眼花缭乱的数据,但是会给你很关键的性能对比数据。当然,如果你在某些条件下对其它的统计数据感兴趣,你可以手动的通过添加Attribute的方式来定制结果报表。
说了这么多,上个例子:
using System;
using System.Security.Cryptography;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running; namespace MyBenchmarks
{
[ClrJob(baseline: true), CoreJob, MonoJob, CoreRtJob]
[RPlotExporter, RankColumn]
public class Md5VsSha256
{
private SHA256 sha256 = SHA256.Create();
private MD5 md5 = MD5.Create();
private byte[] data; [Params(, )]
public int N; [GlobalSetup]
public void Setup()
{
data = new byte[N];
new Random().NextBytes(data);
} [Benchmark]
public byte[] Sha256() => sha256.ComputeHash(data); [Benchmark]
public byte[] Md5() => md5.ComputeHash(data);
} public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Md5VsSha256>();
}
}
}
BenchmarkDotNet 非常容易上手。在在测试结束时,它将生成一简明顾要的汇总表
BenchmarkDotNet=v0.11.0, OS=Windows 10.0.16299.309 (1709/FallCreatorsUpdate/Redstone3)
Intel Xeon CPU E5-1650 v4 3.60GHz, 1 CPU, 12 logical and 6 physical cores
Frequency=3507504 Hz, Resolution=285.1030 ns, Timer=TSC
.NET Core SDK=2.1.300-preview1-008174
[Host] : .NET Core 2.1.0-preview1-26216-03 (CoreCLR 4.6.26216.04, CoreFX 4.6.26216.02), 64bit RyuJIT
Job-HKEEXO : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2633.0
Core : .NET Core 2.1.0-preview1-26216-03 (CoreCLR 4.6.26216.04, CoreFX 4.6.26216.02), 64bit RyuJIT
CoreRT : .NET CoreRT 1.0.26414.01, 64bit AOT
Mono : Mono 5.10.0 (Visual Studio), 64bit | Method | Runtime | N | Mean | Error | StdDev | Ratio | Rank |
|------- |-------- |------ |-----------:|----------:|----------:|------:|-----:|
| Sha256 | Clr | 1000 | 8.009 us | 0.0370 us | 0.0346 us | 1.00 | 3 |
| Sha256 | Core | 1000 | 4.447 us | 0.0117 us | 0.0110 us | 0.56 | 2 |
| Sha256 | CoreRT | 1000 | 4.321 us | 0.0139 us | 0.0130 us | 0.54 | 1 |
| Sha256 | Mono | 1000 | 14.924 us | 0.0574 us | 0.0479 us | 1.86 | 4 |
| | | | | | | | |
| Md5 | Clr | 1000 | 3.051 us | 0.0604 us | 0.0742 us | 1.00 | 3 |
| Md5 | Core | 1000 | 2.004 us | 0.0058 us | 0.0054 us | 0.66 | 2 |
| Md5 | CoreRT | 1000 | 1.892 us | 0.0087 us | 0.0077 us | 0.62 | 1 |
| Md5 | Mono | 1000 | 3.878 us | 0.0181 us | 0.0170 us | 1.27 | 4 |
| | | | | | | | |
| Sha256 | Clr | 10000 | 75.780 us | 1.0445 us | 0.9771 us | 1.00 | 3 |
| Sha256 | Core | 10000 | 41.134 us | 0.2185 us | 0.1937 us | 0.54 | 2 |
| Sha256 | CoreRT | 10000 | 40.895 us | 0.0804 us | 0.0628 us | 0.54 | 1 |
| Sha256 | Mono | 10000 | 141.377 us | 0.5598 us | 0.5236 us | 1.87 | 4 |
| | | | | | | | |
| Md5 | Clr | 10000 | 18.575 us | 0.0727 us | 0.0644 us | 1.00 | 3 |
| Md5 | Core | 10000 | 17.562 us | 0.0436 us | 0.0408 us | 0.95 | 2 |
| Md5 | CoreRT | 10000 | 17.447 us | 0.0293 us | 0.0244 us | 0.94 | 1 |
| Md5 | Mono | 10000 | 34.500 us | 0.1553 us | 0.1452 us | 1.86 | 4 |
在生成的图表中,通过不同的视角去展示对比测试的详细信息。可以以不同的格式(CSV、XML、JSON等) 导出数据,甚至生成漂亮的图:
主要功能特点:
在做深入的性能探测方面,BenchmarkDotNet 有很多出色的特色功能。
标准化的基线测试流程:对每个benchmark方法生成独立的工程,自动选择迭代次数,热身,过载开销预估等。
执行可控:BenchmarkDotNet会根据项目选择最合理的测试参数去做性能测试。当然,如果你对自己的程序执行有很清晰的认识,可以手动调整测试参数。比如调整迭代次数,选择是从cold start 还是warmed state开始,设定精度水平,微调GC的参数,改变环境变量等。
统计分析:您会看到重要的性能分析数据,如平均值和标准差,但您也可以手动调整显示最小/最大值、置信区间、偏度、峰度、保留位数、百分位数,或定义自己的度量。
比较环境参量:这些参量都很容易做出性能比较;x86 vs x64, LegacyJit vs RyuJit, Mono vs .NET Core,等。
相对性能:很容易地评估不同环境方法之间的差异。
内存消耗侦测: BenchmarkDotNet不仅仅测试代码性能,还能提供关于内存消耗峰值压力和GC回收的次数。
程序集检测:通过添加单一的附加特性,就可以列出程序集。
参数定制:根据不同的参数,评估出不同参数的性能,那些参数集就像做单元测试时候的一样。
物理环境信息:当做性能对比分析的时候,需要列出不同的环境参量,BenchmarkDotNet 自动的列出这些环境参量,比如操作系统版本、处理器、物理CPU的数量、物理核数、逻辑核数、硬件记时频率;及时编译器版本等。
命令行支持:你可以管理你数千的benchmark,通过类别来给它们分组,过滤运行它们通过命令行命令。
强大的报表分析:可以输出不总不同的性能分析结果,比如markdown,csv,html,plain text, png 图谱。
已经支持的技术
BenchmarkDotNet 支持所有的.Net 技术栈:
支持的运行时: .NET Framework (4.6+), .NET Core (2.0+), Mono, CoreRT
支持的编程语言:C#, F#, Visual Basic
支持的操作系统:Windows, Linux, macOS
用户
BenchmarkDotNet 被众多的星级项目用来做性能分析,并且作为测试代码成为不可缺少的一部分(不做对应的测试没人相信你的代码质量):
- CoreCLR (.NET Core runtime)
- CoreFX (.NET Core foundational libraries; see also official benchmarking guide),
- Roslyn (C# and Visual Basic compiler)
- KestrelHttpServer (A cross platform web server for ASP.NET Core)
- SignalR
- EntityFrameworkCore
- F#
- Orleans
- Newtonsoft.Json
- Elasticsearch.Net
- Dapper
- Expecto
- Accord.NET Framework
- ImageSharp
- RavenDB
- NodaTime
- Jint
- NServiceBus
- Serilog
- Autofac
- Npgsql
仅仅列出一部分,在On GitHub上,你能找到成百上千的与BenchmarkDotNet相关的问题和提交。
欢迎做出您的奉献!
BenchmarkDotNet 现在已经是一个很稳定,功能强大的达到专业水准的性能分析工具,但是它还会继续更新演进;为此我们会持续添加新功能,并且也有很多新的功能需要开发,任何您的奉献我们都非常感谢。您可以帮助开发新功能,解决bug,书写文档或者做其它您认为很酷的事情。
如果您想奉献,请签出 Contributing guide 和 up-for-grabs 。如果您针对某个问题有新的意见或者观点请创建一个新的问题 create a new issue. 让我们一起打造一个更酷的基线测试工具。
代码准侧
这个项目采取了Contributor Covenant 所定义的代码准侧,这些准侧主要来自社区, 详情请看 .NET Foundation Code of Conduct.
.NET 基金会
这个工程已经得到.Net基金会的支持(.NET Foundation) .
.NET平台性能测试工具BenchmarkDotnet 简介[译文]的更多相关文章
-
性能测试工具BenchmarkDotnet
.NET Core中的性能测试工具BenchmarkDotnet https://www.cnblogs.com/lwqlun/p/9671611.html 背景介绍 之前一篇博客中,我们讲解.NET ...
-
Redis性能测试工具benchmark简介
Redis自己提供了一个性能测试工具redis-benchmark.redis-benchmark可以模拟N个机器,同时发送M个请求. 用法:redis-benchmark [-h -h <ho ...
-
.NET Core中的性能测试工具BenchmarkDotnet
背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...
-
性能测试工具LoadRunner02-LR简介
使用LoadRunner的步骤 制定性能测试计划-->开发测试脚本-->设计测试场景-->执行测试场景-->监控测试场景-->分析测试结果 LoadRunner由哪些部件 ...
-
Web性能测试工具:http_load安装&;使用简介
除了siege,在Web性能测试工具中,http_load也是比较热门和常见的一款,有时因为种种原因,只能使用现成的工具,所以多了解和掌握一种Web性能测试工具是很有必要的. 1.下载安装包 略过 2 ...
-
Web性能测试工具:Siege安装&;使用简介
在Web性能测试工具中,siege是比较热门和常见的,它有安装简单,使用简单,测试报告详细的特点. 并且可以在文本中预定义一系列待测试url模拟,并可设定一定并发量下持续指定时间or测试进行测试. 比 ...
-
Android性能测试工具APT使用指南
腾讯的安卓平台高效的性能测试工具APT(Android Performance Testing Tools),适用于开发自测和定位性能瓶颈,帮助测试人员完成性能基准测试.竞品测试. APT提供了CPU ...
-
【腾讯开源】Android性能测试工具APT使用指南
[腾讯开源]Android性能测试工具APT使用指南 2014-04-23 09:58 CSDN CODE 作者 CSDN CODE 17 7833 腾讯 apt 安卓 性能测试 开源 我们近日对腾讯 ...
-
Linux 网络性能测试工具 iperf 的安装和使用
简介:Iperf是一个网络性能测试工具.可以测试TCP和UDP带宽质量,可以测量最大TCP带宽,具有多种参数和UDP特性,可以报告带宽,延迟抖动和数据包丢失.Iperf在Linux和windows平台 ...
随机推荐
-
foreach
一 foreach的语法介绍 PHP 4以上的版本包括了 foreach 结构,这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生 ...
-
细说 C# 中的 IEnumerable和IEnumerator接口
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
-
vim制作c的IDE
编译vim源码 (1)安装依赖 sudo apt-get install python-dev python3-dev ruby-dev libx11-dev libgtk2.0-dev libgtk ...
-
uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型(转)
在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等.咋一看, 好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样 ...
-
less可以做什么?less详解!(less嵌套选择器实现纯CSS二级导航)
前端技术众多,作为一名前端工程师,我们每接触新技术首先要懂得此技术的优势和劣势,这是最基本的.往深入了说还需要懂得技术的应用场景,配合的技术等,方便为以后架构做准备.而less作为一门CSS预处理语言 ...
-
用Python实现一个词频统计(词云+图)
第一步:首先需要安装工具python 第二步:在电脑cmd后台下载安装如下工具: (有一些是安装好python电脑自带有哦) 有一些会出现一种情况就是安装不了词云展示库 有下面解决方法,需看请复制链接 ...
-
top命令参数
参数说明 d 指定每两次屏幕信息刷新之间的时间间隔.当然用户可以使用s交互命令来改变之. p 通过指定监控进程ID来仅仅监控某个进程的状态. q该选项将使top没有任何延迟的进行刷新.如果调用程序有超 ...
-
ios中要在tableview中添加事件的方法
//触摸tableview背景响应事件. UIControl *bgcontrol = [[UIControl alloc]initWithFrame:self.tableView_typeList. ...
-
C#的进度条透明的情况(穿透问题)
如图: 很明显,可以看到透过进度条的框框可以看到下面的软件界面, 之前出现这种情况是因为pictureBox和panel层级之间的关系造成的, 没想到这次的原因居然不是这样,而是因为少了backCol ...
-
Windows下php,mysql,apache相关安装与配置,完善中…
PHP 的安装 由于php是一个zip文件(非install版),安装较为简单解压就行.把解压的 php5.2.1-Win32重命名为 php5.并复制到安装盘目录下.例如安装路径为 c:\php5 ...