|
需求:在开发过程中,同样的两个函数方法都能满足我们的要求,但是,出于性能的考虑,我们会选择性能最优的方法进行调用,如何测试代码的性能呢?
性能基准测试可以帮助程序员对比2个代码段或者方法的性能,这对于代码重写或者重构来说,可以提供一种很好的量化标准。如果没有性能基准测试,很难想象将方法A改为B方法时候,仅凭肉眼如何区分性能的变化。
BenchmarkDotNet是一款强力的.Net性能基准测试库,官网 https://benchmarkdotnet.org/
首先,我们新建一个 .NET Core 3.1 的控制台项目。项目名称为:BenchmarkTest
使用 nuget 命令安装 BenchmarkDotNet,代码如下:
双击项目,修改项目的目标平台,如下:
我们测试 TestMD5 和 TestSHA1 两个方法分别在 .NET Framework 4.7.2 和 .NET Core 3.1 框架下的性能。
代码如下:
尝试执行,报错如下:
// Validating benchmarks:
Assembly BenchmarkTest which defines benchmarks is non-optimized
Benchmark was built without optimization enabled (most probably a DEBUG configuration). Please, build it in RELEASE.
If you want to debug the benchmarks, please see https://benchmarkdotnet.org/arti ... bugging-benchmarks.
将项目切换成 RELEASE 模式,再次启动项目,如下图:
// * Summary *
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18363.1379 (1909/November2018Update/19H2)
Intel Core i5-8259U CPU 2.30GHz (Coffee Lake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=5.0.103
[Host] : .NET Core 3.1.12 (CoreCLR 4.700.21.6504, CoreFX 4.700.21.6905), X64 RyuJIT
.NET 4.7.2 : .NET Framework 4.8 (4.8.4300.0), X64 RyuJIT
.NET Core 3.1 : .NET Core 3.1.12 (CoreCLR 4.700.21.6504, CoreFX 4.700.21.6905), X64 RyuJIT
| Method | Job | Runtime | Mean | Error | StdDev | Min | Max | Median |
|--------- |-------------- |-------------- |---------:|----------:|----------:|---------:|---------:|---------:|
| TestMD5 | .NET 4.7.2 | .NET 4.7.2 | 4.119 us | 0.0804 us | 0.1045 us | 3.958 us | 4.318 us | 4.123 us |
| TestSHA1 | .NET 4.7.2 | .NET 4.7.2 | 4.043 us | 0.0793 us | 0.1085 us | 3.926 us | 4.289 us | 4.003 us |
| TestMD5 | .NET Core 3.1 | .NET Core 3.1 | 1.216 us | 0.0122 us | 0.0114 us | 1.202 us | 1.238 us | 1.214 us |
| TestSHA1 | .NET Core 3.1 | .NET Core 3.1 | 1.307 us | 0.0186 us | 0.0165 us | 1.284 us | 1.336 us | 1.307 us |
// * Hints *
Outliers
TestContext.TestSHA1: .NET 4.7.2 -> 1 outlier was removed (5.52 us)
TestContext.TestSHA1: .NET Core 3.1 -> 1 outlier was removed (1.37 us)
// * Legends *
Mean : Arithmetic mean of all measurements
Error : Half of 99.9% confidence interval
StdDev : Standard deviation of all measurements
Min : Minimum
Max : Maximum
Median : Value separating the higher half of all measurements (50th percentile)
1 us : 1 Microsecond (0.000001 sec)
// ***** BenchmarkRunner: End *****
// ** Remained 0 benchmark(s) to run **
Run time: 00:01:14 (74 sec), executed benchmarks: 4
Global total time: 00:01:20 (80.63 sec), executed benchmarks: 4
// * Artifacts cleanup * 执行完成后,测试结果会保存到我们的项目 \BenchmarkTest\bin\Release\netcoreapp3.1\BenchmarkDotNet.Artifacts\results 文件夹中,分别有 csv、html、md 等格式。
注意:SimpleJob 目标框架选择错误,可能会导致无法正常执行,如下:
Failed to build in Parallel, switching to sequential build
参考资料:https://benchmarkdotnet.org/articles/guides/getting-started.html
|
上一篇:Beyond Compare 提示错误"这个授权密钥已被吊销"的解决方法下一篇:Java 调用 c# webservice 服务器未能识别 HTTP 标头 SOAPAction 的值
|