BenchMark 基准性能测试

BenchmarkDotNet(NuGet获取),对每个benchmark方法生成独立的工程,自动选择迭代次数,热身,过载开销预估等。

为减少编译环境的影响,需要生成Release版本,并在cmd中运行。Debug模式,会慢10~100倍。

using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;
using System;

static void Main(string[] args)
{
    var summary = BenchmarkRunner.Run<Md5VsSha256>();

    Console.WriteLine(DateTime.Now.ToString() + "END");
    Console.WriteLine("按任意键退出......");
    Console.ReadKey();
}

如果需要Debug模式进行调试,可以进行设置:

static void Main(string[] args)
{
    // debug
    BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args,
        new DebugInProcessConfig());
        
    Console.ReadKey();
}

需要测试的方法,用 BenchmarkAttribute 标记。

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Jobs;
using System;
using System.Security.Cryptography;

//[SimpleJob(RunStrategy.Throughput)]
[SimpleJob(RuntimeMoniker.Net47, baseline:true)]
//[SimpleJob(RuntimeMoniker.NetCoreApp30)]
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
[RPlotExporter]
[MemoryDiagnoser]
//[ThreadingDiagnoser]    // .NET Core 3.0
public class Md5VsSha256
{
    private readonly SHA256 _sha256 = SHA256.Create();
    private readonly MD5 _md5 = MD5.Create();
    private byte[] _data;

    // 1. 参数初始化,2个值或多个
    [Params(1000, 10000)]
    public int Num;

    // 2. 每个Num执行一次
    [GlobalSetup]
    public void Setup()
    {
        _data = new byte[Num];
        new Random(42).NextBytes(_data);
    }

    // 3. 测试方法
    [Benchmark]
    public byte[] Sha256()
    {
        return _sha256.ComputeHash(_data);
    }

    // 3. 
    [Benchmark]
    public byte[] Md5()
    {
        return _md5.ComputeHash(_data);
    }

    // 4. 所有的测试方法执行后,每个方法执行一次
    public void GlobalCleanup()
    {
        //
    }

    //[Benchmark]
    //[Arguments(100, 10)]
    public void Benchmark(int a, int b)
    {

    }
}
posted @ 2022-11-28 10:36  wesson2019  阅读(557)  评论(0编辑  收藏  举报