benchmarkdotnet dotnet 基准测试类库试用(一)
使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果
benchmarkdotnet 是dotnet 版本的一个工具,以下是一个简单的试用
环境准备
我使用的是mac系统
- 安装dotnetcoresdk
这个很简单,选择操作系统安装就可以了 - 创建简单console 项目
mkdir benchmark
cd benchmark
dotnet new console
- 添加benckmarldotnet 类库
dotnet add package BenchmarkDotNet
- 添加简单demo
代码来自官方文档
using System;
using System.Security.Cryptography;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
namespace MyBenchmarks
{
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]
public byte[] Md5() => md5.ComputeHash(data);
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Md5VsSha256>();
}
}
}
运行&&查看结果
- 运行
注意对于benchmark 需要的是release 版本的测试
编译类库:
dotnet build -c RELEASE
dotnet bin/RELEASE/netcoreapp2.2/benchmark.dll
或者直接:
dotnet run -c release
- 运行效果
// Validating benchmarks:
// ***** BenchmarkRunner: Start *****
// ***** Found 2 benchmark(s) in total *****
// ***** Building 1 exe(s) in Parallel: Start *****
Unable to find .sln file. Will use current directory /Users/dalong/mylearning/aspnetcore-learning/benchmark to search for project file. If you don't use .sln file on purpose it should not be a problem.
// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 in /Users/dalong/mylearning/aspnetcore-learning/benchmark/bin/RELEASE/netcoreapp2.2/4fdd42ee-69c6-492c-805f-2ee1777729fb
// command took 1.73s and exited with 0
// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 in /Users/dalong/mylearning/aspnetcore-learning/benchmark/bin/RELEASE/netcoreapp2.2/4fdd42ee-69c6-492c-805f-2ee1777729fb
// command took 3.21s and exited with 0
// ***** Done, took 00:00:05 (5.11 sec) *****
// Found 2 benchmarks:
// Md5VsSha256.Sha256: DefaultJob
// Md5VsSha256.Md5: DefaultJob
// **************************
// Benchmark: Md5VsSha256.Sha256: DefaultJob
// *** Execute ***
// Launch: 1 / 1
// Execute: dotnet "4fdd42ee-69c6-492c-805f-2ee1777729fb.dll" --benchmarkName "MyBenchmarks.Md5VsSha256.Sha256" --job "Default" --benchmarkId 0 in /Users/dalong/mylearning/aspnetcore-learning/benchmark/bin/RELEASE/netcoreapp2.2/4fdd42ee-69c6-492c-805f-2ee1777729fb/bin/Release/netcoreapp2.2
Failed to set up high priority. Make sure you have the right permissions. Message: Permission denied
// BeforeAnythingElse
// Benchmark Process Environment Information:
// Runtime=.NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT
// GC=Concurrent Workstation
// Job: DefaultJob
OverheadJitting 1: 1 op, 598964.00 ns, 598.9640 us/op
WorkloadJitting 1: 1 op, 1470156.00 ns, 1.4702 ms/op
OverheadJitting 2: 16 op, 1153574.00 ns, 72.0984 us/op
WorkloadJitting 2: 16 op, 1908217.00 ns, 119.2636 us/op
WorkloadPilot 1: 16 op, 498621.00 ns, 31.1638 us/op
WorkloadPilot 2: 32 op, 976046.00 ns, 30.5014 us/op
WorkloadPilot 3: 64 op, 1959744.00 ns, 30.6210 us/op
WorkloadPilot 4: 128 op, 4449342.00 ns, 34.7605 us/op
WorkloadPilot 5: 256 op, 7827198.00 ns, 30.5750 us/op
WorkloadPilot 6: 512 op, 15652304.00 ns, 30.5709 us/op
WorkloadPilot 7: 1024 op, 31633970.00 ns, 30.8925 us/op
WorkloadPilot 8: 2048 op, 60219960.00 ns, 29.4043 us/op
WorkloadPilot 9: 4096 op, 122998260.00 ns, 30.0289 us/op
WorkloadPilot 10: 8192 op, 243277420.00 ns, 29.6970 us/op
WorkloadPilot 11: 16384 op, 490180822.00 ns, 29.9183 us/op
WorkloadPilot 12: 32768 op, 1006114105.00 ns, 30.7042 us/op
OverheadWarmup 1: 32768 op, 148275.00 ns, 4.5250 ns/op
- 生成的报告目录
html 报告结果
- 其他运行方式
实际上官方文档已经提供了比较全的运行方法
通过全局工具方式
dotnet tool install -g BenchmarkDotNet.Tool
dotnet benchmark MyAssemblyWithBenchmarks.dll --filter *
网络url
string url = "<E.g. direct link to raw content of a gist>";
var summary = BenchmarkRunner.RunUrl(url);
源码
string benchmarkSource = "public class MyBenchmarkClass { ...";
var summary = BenchmarkRunner.RunSource(benchmarkSource);
BenchmarkSwitcher
static void Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
dotnet run -c Release -- --job short --runtimes clr core --filter *BenchmarkClass1*
说明
dotnet 的工具连是越来越丰富了,而且也越来人性化了,实际上基本上各种语言都是类似的实现类库。
参考资料
https://benchmarkdotnet.org/articles/guides/how-to-run.html
https://github.com/dotnet/BenchmarkDotNet
https://github.com/rongfengliang/aspnetcore-webapi-docker-compose-demo