Skip to content

BenchmarkDotNet 性能测试库

约 678 字大约 2 分钟

组件

2025-08-27

BenchmarkDotNet 是一个开源的性能测试库,专门为 .NET 开发者设计

  • 精确测量代码的执行时间(包括微秒级精度)。
  • 分析内存分配(如 GC 压力、堆分配大小等)。
  • 比较不同实现的性能(如不同算法或数据结构的效率)。
  • 生成详细的报告,包括统计数据和图表。
  • 跨平台支持,适用于 .NET Framework、.NET Core 和 .NET 5/6/7/8 等

使用

  • 安装 BenchmarkDotNet
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

public class StringConcatBenchmark
{
    private readonly string _data = "Hello, World!";

    [Benchmark]
    public string StringFormat()
    {
        return string.Format("{0 } {1}", _data, _data);
    }

    [Benchmark]
    public string StringCZ()
    {
        return $"{_data}  {_data}";
    }

    [Benchmark]
    public string StringConcat()
    {
        return _data + " " + _data;
    }

    [Benchmark]
    public string StringBuilderConcat()
    {
        return new StringBuilder()
            .Append(_data)
            .Append(" ")
            .Append(_data)
            .ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 运行基准测试
        var summary = BenchmarkRunner.Run<StringConcatBenchmark>();
    }
}

使用说明

  1. 引入命名空间
    • BenchmarkDotNet.Attributes:包含特性(Attribute),用于标记需要测试的方法。
    • BenchmarkDotNet.Running:包含 BenchmarkRunner,用于运行基准测试。
  2. 标记基准测试方法
    • [Benchmark] 特性标记需要测量的代码块。
    • 每个标记为 [Benchmark] 的方法都会被单独测试。
  3. 运行测试
    • BenchmarkRunner.Run<T>() 会自动运行所有标记为 [Benchmark] 的方法,并生成性能报告。
  4. 确保项目以 Release 模式运行,或者x64
  5. 测试结果
    • 会输出在bin/Release/[项目版本号]/BenchmarkDotNet.Artifacts/results文件内

输出结果解析:

MethodMeanErrorStdDevMedianGen0Allocated
StringFormat61.32 ns2.746 ns8.010 ns64.06 ns0.006180 B
StringCZ17.89 ns0.628 ns1.792 ns18.24 ns0.006180 B
StringConcat17.76 ns0.477 ns1.400 ns18.05 ns0.006180 B
StringBuilderConcat64.12 ns2.962 ns8.353 ns66.81 ns0.0220288 B
  • Mean:平均执行时间(纳秒)
  • Error:误差范围
  • StdDev:标准偏差,反映结果的稳定性
  • Median:(中位数)
  • Gen0:堆中分配的对象数量或内存量,评估代码回收的压力
  • Allocated:内存分配量

高级功能

  • 参数化测试: 可以使用 [Params] 特性测试不同输入参数的性能。 [Params(10, 100, 1000)]
  • 测试内存分配: 通过 [MemoryDiagnoser] 特性,只能在类上使用
  • 自定义 Job: 通过 [SimpleJob] 或更详细的配置自定义测试环境 [SimpleJob(RunStrategy.Throughput, launchCount: 1, warmupCount: 5, iterationCount: 10)]
      • RunStrategy:指定运行策略(如 Throughput 表示吞吐量模式)。
    • launchCount:启动次数。
    • warmupCount:预热次数。
    • iterationCount:迭代次数。
  • 比较多个框架: 通过 [CoreJob]、[NetFrameworkJob] 等特性,可以跨不同 .NET 框架(如 .NET Core、.NET Framework)进行测试
  • 统计分析: 通过 [Benchmark(Baseline = true)] 将某个方法设为基准,其他方法的性能会与之对比
  • 柱状图:通过 [RPlotExporter] 生成性能对比图
  • 导出结果: 默认生成 HTML、CSV 和 Markdown 格式的报告。你也可以通过 [CsvExporter] 等特性自定义导出格式