項目中須要用到性能測試,發現.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) .