BenchmarkDotNet 能精确测量 .NET 代码性能,通过自动预热、多轮迭代、统计分析和结构化输出,避免了手动测试受 JIT、GC 等因素干扰。使用 [Benchmark] 标记方法,配合 BenchmarkRunner.Run 执行测试,可获取平均耗时(Mean)、内存分配(Allocated)和 GC 次数等关键指标。借助 [MemoryDiagnoser]、[RankColumn] 和 [Params] 等特性,可深入分析不同场景下的性能表现,实现从“猜测”到“验证”的优化。
BenchmarkDotNet 是一个强大的 .NET 库,能够帮助开发者在真实环境中精确测量代码的
执行性能。它通过自动处理预热、垃圾回收影响、多次迭代取样等复杂细节,让你专注于编写待测试的逻辑,而不是性能测试的基础设施。
.NET 开发中常见的性能测试方式如 DateTime.Now 或 Stopwatch 虽然简单,但容易受环境干扰,比如 JIT 编译延迟、GC 回收时机、CPU 调频等。BenchmarkDotNet 通过以下机制规避这些问题:
首先通过 NuGet 安装 BenchmarkDotNet:
Install-Package BenchmarkDotNet然后创建一个包含测试方法的类,使用 [Benchmark] 特性标记要测量的方法:
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
[MemoryDiagnoser]
public class StringConcatBenchmarks
{
private string a = "hello";
private string b = "world";
[Benchmark]
public string ConcatWithPlus() => a + " " + b;
[Benchmark]
public string ConcatWithStringFormat() => string.Format("{0} {1}", a, b);
[Benchmark]
public string ConcatWithInterpolation() => $"{a} {b}";
}
// 在 Main 方法中运行
var summary = BenchmarkRunner.Run();
运行后,你会看到控制台输出详细的性能数据,包括平均耗时、内存分配、GC 次数等。
BenchmarkDotNet 提供了丰富的配置选项来满足不同场景需求:
例如,使用 Params 测试不同长度字符串的影响:
[Params(100, 1000)]
public int N;
[Benchmark]
public void ProcessLargeList()
{
var list = new List(N);
for (int i = 0; i < N; i++) list.Add(i);
}
典型输出包含以下关键列:
结合这些数据,你可以判断某个实现是否更快、更省内存,从而做出合理的技术选型。
基本上就这些。用好 BenchmarkDotNet,能让性能优化从“猜测”变成“验证”。