.NET平台性能測試工具BenchmarkDotnet 簡介[譯文]


項目中需要用到性能測試,發現.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(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等) 導出數據,甚至生成漂亮的圖:

主要功能特點:

在做深入的性能探測方面,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 被眾多的星級項目用來做性能分析,並且作為測試代碼成為不可缺少的一部分(不做對應的測試沒人相信你的代碼質量):

僅僅列出一部分,在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) .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM