架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16384|回复: 2

[交流] .NET/C# 使用 BenchmarkDotNet 测试代码性能

[复制链接]
发表于 2021-3-3 15:51:12 | 显示全部楼层 |阅读模式
需求:在开发过程中,同样的两个函数方法都能满足我们的要求,但是,出于性能的考虑,我们会选择性能最优的方法进行调用,如何测试代码的性能呢?

性能基准测试可以帮助程序员对比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 模式,再次启动项目,如下图:
QQ截图20210303154044.jpg QQ截图20210303154213.jpg

// * 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 等格式。

QQ截图20210303154432.jpg

注意: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 的值
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-3-31 15:56:47 | 显示全部楼层
1、mean翻译:均值,通常指算术平均,也可以是几何平均。

叙述:把一组序列中的所有值加起来,然后除以总个数,就是均值。

2、median翻译:中间值。

叙述:把一组序列按照升序的方式排列,然后取中间的那个值,就是中间值。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-5-25 20:13:33 | 显示全部楼层
.NET/C# 使用 Span 高性能处理字符串
https://www.itsvse.com/thread-10596-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-6-16 13:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表