项目中须要用到性能测试,发现.net 平台的这个神器. 以为很不错,接下来准备作个系列。具体参考官方介绍html
作基线对比测试不是那么容易,你很容易就翻车掉坑里,BenchmarkDotNet 会帮你避坑(即便你是老司机),它会帮你干不少体力活,好比它会针对每一个benchmark方法生成独立的工程项目,并启动这些单独的工程,迭代屡次运行benchmark方法(包括测试前的热身)等。一般,你不须要关注这些benchmark方法的迭代次数,BenchmarkDotNet 会根据它的经验选中合适的迭代次数。git
有了BenchmarkDotNet,作性能对比测试就很是容易了,只须要把你的测试方法加上特性[Benchmark], 想作不一样.net平台的性能测试,好比传统的 .NET Framework, .NET Core, and Mono,这些都没问题,加一个特性就会把面向不一样平台的测试工程生成出来,随后运行后将会生成不一样平台的性能对比结果。能够这么说,它能够测试对比任何不一样的测试环境,好比 不一样的处理器架构(x86/x64)、不一样的JIT编译器(LegacyJIT/RyuJIT)、不一样的垃圾回收机制(如服务器/工做站),除此以外,同时还能够引入不一样的输入参数(一个或者几个),对比其它条件相同而参数不一样时候的性能对比。github
BenchmarkDotNet 不只仅是帮你运行benchmark方法,还帮你分析生成的结果:它会生成不一样形式的报表,它的结果报表都是统计分析出来的,它不会一会儿给你不少眼花缭乱的数据,可是会给你很关键的性能对比数据。固然,若是你在某些条件下对其它的统计数据感兴趣,你能够手动的经过添加Attribute的方式来定制结果报表。web
说了这么多,上个例子:sql
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(1000, 10000)] public int N; [GlobalSetup] public void Setup() { data = new byte[N]; new Random(42).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等) 导出数据,甚至生成漂亮的图:api
在作深刻的性能探测方面,BenchmarkDotNet 有不少出色的特点功能。服务器
标准化的基线测试流程:对每一个benchmark方法生成独立的工程,自动选择迭代次数,热身,过载开销预估等。markdown
执行可控: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 被众多的星级项目用来作性能分析,而且做为测试代码成为不可缺乏的一部分(不作对应的测试没人相信你的代码质量):
仅仅列出一部分,在On GitHub上,你能找到成百上千的与BenchmarkDotNet相关的问题和提交。
BenchmarkDotNet 如今已是一个很稳定,功能强大的达到专业水准的性能分析工具,可是它还会继续更新演进;为此咱们会持续添加新功能,而且也有不少新的功能须要开发,任何您的奉献咱们都很是感谢。您能够帮助开发新功能,解决bug,书写文档或者作其它您认为很酷的事情。
若是您想奉献,请签出 Contributing guide 和 up-for-grabs 。若是您针对某个问题有新的意见或者观点请建立一个新的问题 create a new issue. 让咱们一块儿打造一个更酷的基线测试工具。
这个项目采起了Contributor Covenant 所定义的代码准侧,这些准侧主要来自社区, 详情请看 .NET Foundation Code of Conduct.
这个工程已经获得.Net基金会的支持(.NET Foundation) .