BenchmarkDotNet性能测试库

2023/7/6 10:13:38

BenchmarkDotNet 是一个强大的. NET 库, 可用于性能测试,在一些应用程序中要精确测试性能是很困难的,有了 Benchmark 就能精准简单的测试应用程序性能,它为每个测试方法生成一个独立的项目, 执行此项目的多个启动, 并运行测试方法,以保证测试的精准性。

BenchmarkDotNet性能测试库

要想测试一个函数的性能是很简单的,只需要在函数上标记 BenchmarkAttribute 特性即可,不仅仅帮您测试函数,而且还能分析结果,并生成不同的格式的性能报告, 最终呈现漂亮的图表,它会计算许多统计数据, 允许您运行统计测试, 并比较不同测试方法的结果,它试图帮助您进行质量性能调查。

要想使用 BenchmarkDotNet 是很容易的,首先通过 NuGet 包管理器将库安装到项目中。

Install-Package BenchmarkDotNet

然后就可以在项目中使用 BenchmarkDotNet 来测试性能了,以下是最简单的使用方法:

    using System;
    using System.Security.Cryptography;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;

    namespace MyBenchmarks
    {
        [ClrJob(isBaseline: 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>();
            }
        }
    }</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-HK: .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 | Scaled | 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 技术,可参阅以下博客:

本文告诉大家如何使用 BenchmarkDotNet 做测试

.NET Core性能测试组件 BenchmarkDotNet

使用 BenchmarkDotnet 测试代码性能