BenchmarkDotNet

lanwah發表於2024-04-21

目錄
  • 官方開源地址和文件
  • How it works
  • Choosing RunStrategy
  • 簡單使用示例
  • BenchmarkDotNet列印列的含義
  • Benchmark輸出列
  • Benchmark特性
  • 相關參考
  • 版權特別宣告


官方開源地址和文件

GitHub:GitHub - dotnet/BenchmarkDotNet: Powerful .NET library for benchmarking

文件首頁:Overview | BenchmarkDotNet

How it works

hand-right https://benchmarkdotnet.org/articles/guides/how-it-works.html

BenchmarkDotNet follows the following steps to run your benchmarks:

  1. BenchmarkRunner generates an isolated project per each runtime settings and builds it in Release mode.

  2. Next, we take each method/job/params combination and try to measure its performance by launching benchmark process several times (LaunchCount).

  3. 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>
  4. 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.

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.

hand-right 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

相關參考

  1. 效能基準測試工具 --- BenchmarkDotNet

版權特別宣告

本文只用於記錄本人使用BenchmarkDotNet時的一些參考,不做任何其他用途,其中參考的文章在 相關參考 中也給出了原文地址。