【基準(zhǔn)測(cè)試】BenchmarkDotNet介紹

BenchmarkDotNet 概述


BenchmarkDotNet helps you to transform methods into benchmarks, track their performance, and share reproducible measurement experiments. It's no harder than writing unit tests

提取幾個(gè)關(guān)鍵字(其實(shí)是只認(rèn)識(shí)那幾個(gè)英文單詞)

  • 將方法轉(zhuǎn)換基準(zhǔn)測(cè)試
  • 跟蹤性能
  • 可重復(fù)實(shí)驗(yàn)
  • 不必單元測(cè)試難

說白了,就是代碼的性能測(cè)試双藕,通常是用來比較兩段代碼/方法绢馍,或者在不同平臺(tái)上的執(zhí)行效果。

BenchmarkDotNet 快速入門


  1. 添加包
dotnet add package BenchmarkDotNet
  1. 添加需要基準(zhǔn)測(cè)試的方法(這里我準(zhǔn)備兩個(gè)排序算法被芳,快速排序 && 堆排序)
[Benchmark]
[Arguments(new int[] { 3, 1, 10, 9, 6, 2, 5, 7, 8, 4 })]
public void QuickSort(int[] nums) => Demo.BenchmarkDotNet.QuickSort.Sort(nums);

[Benchmark]
[Arguments(new int[] { 3, 1, 10, 9, 6, 2, 5, 7, 8, 4 })]
public void HeapSort(int[] nums) => Demo.BenchmarkDotNet.HeapSort.Sort(nums);
  1. Main里執(zhí)行BenchmarkRunner.Run
var summary = BenchmarkRunner.Run<QuickSortVsHeapSort>();
  1. 執(zhí)行(需要Release模式)
dotnet run -c=Release
  1. 分析結(jié)果
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18363.778 (1909/November2018Update/19H2)
Intel Core i7-10510U CPU 1.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.202
  [Host]     : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT
  DefaultJob : .NET Core 3.1.4 (CoreCLR 4.700.20.20201, CoreFX 4.700.20.22101), X64 RyuJIT


|    Method |      nums |     Mean |    Error |   StdDev |
|---------- |---------- |---------:|---------:|---------:|
| QuickSort | Int32[10] | 61.98 ns | 0.242 ns | 0.202 ns |
|  HeapSort | Int32[10] | 89.19 ns | 0.374 ns | 0.332 ns |

除了控制臺(tái)牍鞠,還可以在BenchmarkDotNet.Artifacts/result找到多種格式的輸出結(jié)果

可以看到QuickSort 寒随,HeapSort比較接近卖丸,但是我們測(cè)試的數(shù)據(jù)量太少纺且,所以這個(gè)沒代表性

  1. 總結(jié)

可以看到BenchmarkDotNet對(duì)原來的代碼是沒有侵入式,通常我是新建一個(gè)測(cè)試類稍浆,然后再測(cè)試類初始化測(cè)試參數(shù)载碌,這樣對(duì)原來代碼沒有侵入

進(jìn)階用法

多組輸入?yún)?shù)

[Benchmark]
[ArgumentsSource(nameof(Data))]
public void QuickSort(int[] nums) => Demo.BenchmarkDotNet.QuickSort.Sort(nums);

public IEnumerable<int[]> Data()
{
    var random = new Random();
    var datas = Enumerable.Range(1, 10000).ToArray();
    // 打亂數(shù)組
    for (int i = datas.Length - 1; i > 0; i--)
    {
        var value = datas[i];
        var randomIndex = random.Next(0, i);
        datas[i] = datas[randomIndex];
        datas[randomIndex] = value;
    }
    yield return datas.Take(100).ToArray();
    yield return datas.Take(1000).ToArray();
    yield return datas;
}

ArgumentsSource : 參數(shù)可以是方法/屬性的名稱

多平臺(tái)比較

  1. 在基準(zhǔn)測(cè)試類中添加SimpleJob
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
[SimpleJob(RuntimeMoniker.Net472)]
public class QuickSortVsHeapSort
{
}
  1. 項(xiàng)目方案添加多個(gè)運(yùn)行時(shí)
<TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>

添加統(tǒng)計(jì)字段

在基準(zhǔn)測(cè)試類添加MaxColumn , MinColumn,MemoryDiagnoser

[MaxColumn, MinColumn, MemoryDiagnoser]
public class QuickSortVsHeapSort
{
  ...
}

添加基準(zhǔn)

比較快速排序和堆排序,可以用其中一個(gè)作為基準(zhǔn)衅枫,也可以新增一個(gè)作為基準(zhǔn)作為參考嫁艇。例如這里選擇以冒泡排序作為基準(zhǔn) ,下圖是各個(gè)排序算法的時(shí)間復(fù)雜度

排序 平均情況 最壞情況 最好情況 空間復(fù)雜度
冒泡排序 O(n^2) O(n^2) O(n^2) O(1)
快速排序 O(n\log_2n) O(n^2) O(n\log_2n) O(n\log_2n)
堆排序 O(n\log_2n) O(n\log_2n) O(n\log_2n) O(1)
[Benchmark(Baseline = true)]
[ArgumentsSource(nameof(Data))]
public void BubbleSort(int[] nums) => Demo.BenchmarkDotNet.BubbleSort.Sort(nums);

使用BenchmarkDotNet 模板

  1. 安裝模板
dotnet new -i BenchmarkDotNet.Templates
  1. 創(chuàng)建模板
dotnet new benchmark

使用BenchmarkDotNet dotnet tool

  1. 安裝
dotnet tool install -g BenchmarkDotNet.Tool
  1. 使用
dotnet benchmark [arguments] [options]

示例源碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末为鳄,一起剝皮案震驚了整個(gè)濱河市裳仆,隨后出現(xiàn)的幾起案子腕让,更是在濱河造成了極大的恐慌孤钦,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纯丸,死亡現(xiàn)場(chǎng)離奇詭異偏形,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)觉鼻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門俊扭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坠陈,你說我怎么就攤上這事萨惑【杩担” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵庸蔼,是天一觀的道長(zhǎng)解总。 經(jīng)常有香客問我,道長(zhǎng)姐仅,這世上最難降的妖魔是什么花枫? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮掏膏,結(jié)果婚禮上劳翰,老公的妹妹穿的比我還像新娘。我一直安慰自己馒疹,他們只是感情好佳簸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著行冰,像睡著了一般溺蕉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悼做,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天疯特,我揣著相機(jī)與錄音,去河邊找鬼肛走。 笑死漓雅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朽色。 我是一名探鬼主播邻吞,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼葫男!你這毒婦竟也來了抱冷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤梢褐,失蹤者是張志新(化名)和其女友劉穎旺遮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盈咳,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耿眉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鱼响。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸣剪。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筐骇,到底是詐尸還是另有隱情债鸡,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布铛纬,位于F島的核電站娘锁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饺鹃。R本人自食惡果不足惜莫秆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悔详。 院中可真熱鬧镊屎,春花似錦、人聲如沸茄螃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽归苍。三九已至用狱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拼弃,已是汗流浹背夏伊。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吻氧,地道東北人溺忧。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盯孙,于是被迫代替她去往敵國(guó)和親鲁森。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344