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
示例源码测试