BenchmarkDotNet
官方开源地址和文档
GitHub:GitHub - dotnet/BenchmarkDotNet: Powerful .NET library for benchmarking
文档首页:Overview | BenchmarkDotNet
How it works
https://benchmarkdotnet.org/articles/guides/how-it-works.html
BenchmarkDotNet follows the following steps to run your benchmarks:
-
BenchmarkRunnergenerates an isolated project per each runtime settings and builds it in Release mode. -
Next, we take each method/job/params combination and try to measure its performance by launching benchmark process several times (
LaunchCount). -
An invocation of the workload method is an operation . A bunch of operation is an iteration . If you have an IterationSetup method, it will be invoked before each iteration, but not between operations. We have the following type of iterations:
Pilot: The best operation count will be chosen.OverheadWarmup,OverheadWorkload: BenchmarkDotNet overhead will be evaluated.ActualWarmup: Warmup of the workload method.ActualWorkload: Actual measurements.Result=ActualWorkload-<MedianOverhead>
-
After all of the measurements, BenchmarkDotNet creates:
- An instance of the
Summaryclass that contains all information about benchmark runs. - A set of files that contains summary in human-readable and machine-readable formats.
- A set of plots.
- An instance of the
Choosing RunStrategy
If you run a benchmark, you always (explicitly or implicitly) use a job. Each Job has the RunStrategy parameter which allows switching between different benchmark modes. The default RunStrategy is Throughput, and it works fine for most cases. However, other strategies are also useful in some specific cases.
https://benchmarkdotnet.org/articles/guides/choosing-run-strategy.html
简单使用示例
Program.cs
/// <summary>
/// https://benchmarkdotnet.org/articles/overview.html
/// </summary>
internal class Program
{
static void Main(string[] args)
{
//var hashHelper = new Md5VsSha256();
//var byte1 = hashHelper.Md5();
//var byte2 = hashHelper.Sha256();
//var isEqual = byte1.SequenceEqual(byte2);
var summary = BenchmarkRunner.Run<Md5VsSha256>();
Console.ReadLine();
}
}
Md5VsSha256.cs
[MemoryDiagnoser]
//[SimpleJob(RunStrategy.ColdStart)]
[SimpleJob(RunStrategy.ColdStart, iterationCount: 5)]
public class Md5VsSha256
{
private const int N = 10000;
private readonly byte[] data;
private readonly SHA256 sha256 = SHA256.Create();
private readonly MD5 md5 = MD5.Create();
public Md5VsSha256()
{
data = new byte[N];
new Random(42).NextBytes(data);
}
[Benchmark]
public byte[] Sha256() => sha256.ComputeHash(data);
[Benchmark(Baseline = true)]
public byte[] Md5() => md5.ComputeHash(data);
}
BenchmarkDotNet打印列的含义
| 列名 | 含义 |
|---|---|
| Method | 测试方法的名称 |
| Mean | 测试运行的平均时间 |
| Error | 测试运行的标准误差,标准误差是测试结果的离散程度的度量,标准误差越小,表示测试结果越稳定 |
| StdDev | 所有测试运行的标准偏差,标准偏差是测试结果的离散程度的度量,标准偏差越小,表示测试结果越接近平均值。 |
| Median | 所有测试运行的中位数。中位数是测试结果的中间值,如果测试结果的个数为奇数,则中位数为中间的那个值;如果测试结果的个数为偶数,则中位数为中间两个值的平均值。 |
| Ratio | 每个测试运行的平均时间与基准测试运行的平均时间的比值。基准测试是性能最好的测试,它的比值为 1.0。其他测试的比值表示它们相对于基准测试的性能表现,比值越小,表示性能越好。 |
| RatioSD | 所有测试运行的比值的标准偏差。标准偏差越小,表示比值的离散程度越小,测试结果更稳定。 |
| Gen 0 | 所有测试运行期间生成的第 0 代垃圾回收的次数。垃圾回收是 .NET 运行时自动回收不再使用的内存的机制,Generational Garbage Collection 是 .NET 中的一种垃圾回收算法。 |
| Gen 1 | 所有测试运行期间生成的第 1 代垃圾回收的次数。 |
| Gen 2 | 所有测试运行期间生成的第 2 代垃圾回收的次数。 |
| Allocated | 所有测试运行期间分配的内存总量。 |
Benchmark输出列
| 列 | 含义 |
|---|---|
| [MemoryDiagnoser] | 输出内存分配及回收信息,会输出: Gen0 Gen1 Gen2 Allocated Alloc Ratio 列信息 |
| [RankColum] | 输出排名信息,会输出: Rank 列信息 |
| MinColumn | |
| MaxColumn | |
| MeanColumn | |
| MedianColumn | 所有测试运行的中位数。中位数是测试结果的中间值,如果测试结果的个数为奇数,则中位数为中间的那个值;如果测试结果的个数为偶数,则中位数为中间两个值的平均值。 |
Benchmark特性
| 特性 | 作用于 | 含义 |
|---|---|---|
| Benchmark | AttributeTargets.Method | |
| [Benchmark(Baseline = true)] | AttributeTargets.Method | 定义基线方法,详见:IntroBenchmarkBaseline |
| [Params(true, false)] | AttributeTargets.Property AttributeTargets.Field |
IntroParams |
| [Arguments(100, 10)] | AttributeTargets.Method | IntroArguments |
| [SimpleJob(RunStrategy.ColdStart)] | AttributeTargets.Class | 冷启动模式,没有试点和预热阶段,详见:IntroColdStart |
| [DryJob] | AttributeTargets.Class | 只运行基准一次,会输出反汇编结果,详见:IntroDisassemblyDry |
| [GlobalSetup] [GlobalCleanup] |
AttributeTargets.Method | IntroSetupCleanupGlobal |
相关参考
版权特别声明
本文只用于记录本人使用BenchmarkDotNet时的一些参考,不做任何其他用途,其中参考的文章在 相关参考 中也给出了原文地址。

浙公网安备 33010602011771号