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
dotnet add package BenchmarkDotNet
[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);
var summary = BenchmarkRunner.Run<QuickSortVsHeapSort>();
dotnet run -c=Release
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比較接近,可是咱們測試的數據量太少,因此這個沒表明性數組
能夠看到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
[SimpleJob(RuntimeMoniker.NetCoreApp31)] [SimpleJob(RuntimeMoniker.Net472)] public class QuickSortVsHeapSort { }
<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);
dotnet new -i BenchmarkDotNet.Templates
dotnet new benchmark
dotnet tool install -g BenchmarkDotNet.Tool
dotnet benchmark [arguments] [options]
轉載請標明出處 : http://www.javashuo.com/article/p-tjtayaow-nc.html
示例源碼測試