【基準測試】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 testshtml

提取幾個關鍵字(實際上是隻認識那幾個英文單詞)git

  • 將方法轉換基準測試
  • 跟蹤性能
  • 可重複實驗
  • 沒必要單元測試難

說白了,就是代碼的性能測試,一般是用來比較兩段代碼/方法,或者在不一樣平臺上的執行效果。github

BenchmarkDotNet 快速入門


  1. 添加包
dotnet add package BenchmarkDotNet
  1. 添加須要基準測試的方法(這裏我準備兩個排序算法,快速排序 && 堆排序)
[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裏執行BenchmarkRunner.Run
var summary = BenchmarkRunner.Run<QuickSortVsHeapSort>();
  1. 執行(須要Release模式)
dotnet run -c=Release
  1. 分析結果
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 |

除了控制檯,還能夠在BenchmarkDotNet.Artifacts/result找到多種格式的輸出結果算法

能夠看到QuickSort ,HeapSort比較接近,可是咱們測試的數據量太少,因此這個沒表明性數組

  1. 總結

能夠看到BenchmarkDotNet對原來的代碼是沒有侵入式,一般我是新建一個測試類,而後再測試類初始化測試參數,這樣對原來代碼沒有侵入app

進階用法

多組輸入參數

[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();
    // 打亂數組
    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 : 參數能夠是方法/屬性的名稱dom

多平臺比較

  1. 在基準測試類中添加SimpleJob
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
[SimpleJob(RuntimeMoniker.Net472)]
public class QuickSortVsHeapSort
{
}
  1. 項目方案添加多個運行時
<TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>

添加統計字段

在基準測試類添加MaxColumn , MinColumn,MemoryDiagnoser性能

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

添加基準

比較快速排序和堆排序,能夠用其中一個做爲基準,也能夠新增一個做爲基準做爲參考。例如這裏選擇以冒泡排序做爲基準 ,下圖是各個排序算法的時間複雜度單元測試

排序 平均狀況 最壞狀況 最好狀況 空間複雜度
冒泡排序 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. 建立模板
dotnet new benchmark

使用BenchmarkDotNet dotnet tool

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

轉載請標明出處 : http://www.javashuo.com/article/p-tjtayaow-nc.html
示例源碼測試

相關文章
相關標籤/搜索