⭐️ Furion v4 版本支持【所有历史版本】无缝升级,一套代码兼容 .NET 5+ ⭐️
Skip to main content

36.3 基准测试

36.3.1 基准测试

基准测试(benchmarking)是一种测量和评估软件性能指标的活动。你可以在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。这是基准测试最常见的用途。其他用途包括测定某种负载水平下的性能极限、管理系统或环境的变化、发现可能导致性能问题的条件,等等。

36.3.2 基准测试特质及意义

36.3.2.1 特质

  • 可重复性:可进行重复性的测试,这样做有利于比较每次的测试结果,得到性能结果的长期变化趋势,为系统调优和上线前的容量规划做参考。
  • 可观测性:通过全方位的监控(包括测试开始到结束,执行机、服务器、数据库),及时了解和分析测试过程发生了什么。
  • 可展示性:相关人员可以直观明了的了解测试结果(web 界面、仪表盘、折线图树状图等形式)。
  • 真实性:测试的结果反映了客户体验到的真实的情况(真实准确的业务场景+与生产一致的配置+合理正确的测试方法)。
  • 可执行性:相关人员可以快速的进行测试验证修改调优(可定位可分析)。

36.3.2.2 意义

  • 为容量规划确定系统和应用程序的极限;
  • 为配置测试的参数和配置选项提供参考依据;
  • 为验收测试确定系统是否具备自己所宣称的能力;
  • 为性能基线的建立提供长期的数据统计来源以及比较基准;

36.3.3 BenchmarkDotNet

BenchmarkDotNet.NET 平台提供的基准测试工具,BenchmarkDotNet 可帮助您将方法转换为基准,跟踪其性能,并共享可重复的测量实验。BenchmarkDotNet 可保护您免受流行的基准测试错误,并在基准设计或获得的测量中出现问题时警告您。结果以用户友好的形式呈现,突出显示了有关实验的所有重要事实。

36.3.3.1 如何使用

创建一个 控制台 应用程序,并通过 Nuget 安装 BenchmarkDotNet 拓展包。编写测试:

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>();        }    }}

36.3.3.2 查看结果

运行控制器程序,将得到以下结果

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
CoreRt30 : .NET CoreRT 1.0.28236.02 @Commit: 741d61493c560ba96e8151f9e56876d4d3828489, X64 AOT
Mono : Mono 6.4.0 (Visual Studio), X64
MethodRuntimeNMeanErrorStdDevRatio
Sha256.NET 4.7.210007.735 us0.1913 us0.4034 us1.00
Sha256.NET Core 3.010003.989 us0.0796 us0.0745 us0.50
Sha256CoreRt 3.010004.091 us0.0811 us0.1562 us0.53
Sha256Mono100013.117 us0.2485 us0.5019 us1.70
Md5.NET 4.7.210002.872 us0.0552 us0.0737 us1.00
Md5.NET Core 3.010001.848 us0.0348 us0.0326 us0.64
Md5CoreRt 3.010001.817 us0.0359 us0.0427 us0.63
Md5Mono10003.574 us0.0678 us0.0753 us1.24
Sha256.NET 4.7.21000074.509 us1.5787 us4.6052 us1.00
Sha256.NET Core 3.01000036.049 us0.7151 us1.0025 us0.49
Sha256CoreRt 3.01000036.253 us0.7076 us0.7571 us0.49
Sha256Mono10000116.350 us2.2555 us3.0110 us1.58
Md5.NET 4.7.21000017.308 us0.3361 us0.4250 us1.00
Md5.NET Core 3.01000015.726 us0.2064 us0.1930 us0.90
Md5CoreRt 3.01000015.627 us0.2631 us0.2461 us0.89
Md5Mono1000030.205 us0.5868 us0.6522 us1.74

36.3.3.3 导出报表

也可以导出各种图表

36.3.4 反馈与建议

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 BenchmarkDotNet 知识可查阅 BenchmarkDotNet 官网

演练场