外观
BenchmarkDotNet 性能测试库
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>();
}
}使用说明
- 引入命名空间:
- BenchmarkDotNet.Attributes:包含特性(Attribute),用于标记需要测试的方法。
- BenchmarkDotNet.Running:包含 BenchmarkRunner,用于运行基准测试。
- 标记基准测试方法:
- [Benchmark] 特性标记需要测量的代码块。
- 每个标记为 [Benchmark] 的方法都会被单独测试。
- 运行测试:
BenchmarkRunner.Run<T>()会自动运行所有标记为 [Benchmark] 的方法,并生成性能报告。
- 确保项目以 Release 模式运行,或者x64
- 测试结果
- 会输出在
bin/Release/[项目版本号]/BenchmarkDotNet.Artifacts/results文件内
- 会输出在
输出结果解析:
| Method | Mean | Error | StdDev | Median | Gen0 | Allocated |
|---|---|---|---|---|---|---|
| StringFormat | 61.32 ns | 2.746 ns | 8.010 ns | 64.06 ns | 0.0061 | 80 B |
| StringCZ | 17.89 ns | 0.628 ns | 1.792 ns | 18.24 ns | 0.0061 | 80 B |
| StringConcat | 17.76 ns | 0.477 ns | 1.400 ns | 18.05 ns | 0.0061 | 80 B |
| StringBuilderConcat | 64.12 ns | 2.962 ns | 8.353 ns | 66.81 ns | 0.0220 | 288 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] 等特性自定义导出格式
