- 官方開源地址和文件
- How it works
- Choosing RunStrategy
- 簡單使用示例
- BenchmarkDotNet列印列的含義
- Benchmark輸出列
- Benchmark特性
- 相關參考
- 版權特別宣告
官方開源地址和文件
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:
-
BenchmarkRunner
generates 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
Summary
class 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
版權特別宣告
本文只用於記錄本人使用BenchmarkDotNet時的一些參考,不做任何其他用途,其中參考的文章在 相關參考 中也給出了原文地址。