使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试

简介: 使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试

前言

在软件开发领域,性能基准测试是确保软件系统高效、稳定运行的重要环节。它可以帮助你评估应用程序的性能,了解其在不同条件下的响应时间、吞吐量、资源利用率等。通过基准测试,你可以确定系统在处理特定工作负载时的性能表现。

项目介绍

BenchmarkDotNet是一个基于.NET开源、功能全面、易于使用的性能基准测试框架,它为.NET开发者提供了强大的性能评估和优化能力。通过自动化测试、多平台支持、高级统计分析和自定义配置等特性,BenchmarkDotNet帮助开发者更好地理解和优化软件系统的性能表现。

项目特性

  • 支持的语言:C#、F#、Visual Basic。
  • 支持的操作系统:Windows、Linux、macOS。
  • 支持的架构:x86、x64、ARM、ARM64、Wasm 和 LoongArch64。
  • 支持的运行时:.NET 5+、.NET Framework 4.6.1+、.NET Core 3.1+、Mono、NativeAOT

创建控制台应用

创建名为:BenchmarkDotNetExercise的.NET 9控制台应用。

安装 NuGet 包

在NuGet包管理器中搜索:BenchmarkDotNet 包进行安装:

进行性能基准测试

接下来我们对.NET中常见的三种加密哈希函数MD5SHA256SHA1进行性能基准测试,来一起分析一下哪一种哈希算法性能更优、效率更快。

HashFunctionsBenchmark

[MemoryDiagnoser]//记录内存分配情况
    public class HashFunctionsBenchmark
    {
        private readonly string _inputData;
        public HashFunctionsBenchmark()
        {
            // 使用一个较长的字符串作为输入,以更好地反映哈希函数的性能
            _inputData = new string('y', 1000000);
        }
        [Benchmark]
        public byte[] MD5Hash()
        {
            using (MD5 md5 = MD5.Create())
            {
                return md5.ComputeHash(Encoding.UTF8.GetBytes(_inputData));
            }
        }
        [Benchmark]
        public byte[] SHA256Hash()
        {
            using (SHA256 sha256 = SHA256.Create())
            {
                return sha256.ComputeHash(Encoding.UTF8.GetBytes(_inputData));
            }
        }
        [Benchmark]
        public byte[] SHA1Hash()
        {
            using (SHA1 sha1 = SHA1.Create())
            {
                return sha1.ComputeHash(Encoding.UTF8.GetBytes(_inputData));
            }
        }
    }

运行基准测试

internal class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<HashFunctionsBenchmark>();
        }
    }

注意一定要设置为:Release模式运行,假如为Debug模式会提示下面异常:

// Validating benchmarks:
//    * Assembly BenchmarkDotNetExercise 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/articles/guides/troubleshooting.html#debugging-benchmarks.

分析生成的报告

说明:

  • Mean: 所有测量值的算术平均值。
  • Error: 99.9% 置信区间的一半。
  • StdDev: 所有测量值的标准差。
  • Gen0: 第 0 代 GC 每 1000 次操作收集一次。
  • Gen1: 第 1 代 GC 每 1000 次操作收集一次。
  • Gen2: 第 2 代 GC 每 1000 次操作收集一次。
  • Allocated: 每次操作分配的内存(仅托管内存,包含所有内容,1KB = 1024B)。
  • 1 ms: 1 毫秒(0.001 秒)。

报告分析:

Method Mean Error StdDev Gen0 Gen1 Gen2 Allocated
MD5Hash 1.952 ms 0.0169 ms 0.0158 ms 197.2656 197.2656 197.2656 976.9 KB
SHA256Hash 3.907 ms 0.0157 ms 0.0147 ms 195.3125 195.3125 195.3125 976.93 KB
SHA1Hash 1.780 ms 0.0231 ms 0.0193 ms 197.2656 197.2656 197.2656 976.92 KB
  • MD5Hash 的平均耗时稍长于 SHA1Hash,但误差和标准差较小,性能稳定性较好,垃圾回收次数与 SHA1Hash 相同。
  • SHA256Hash 的平均耗时最长,但误差和标准差最小,性能稳定性最好,垃圾回收次数略少于 MD5Hash 和 SHA1Hash。
  • SHA1Hash 的平均耗时最短,但误差和标准差较大,表示其性能虽然优越但不太稳定。

性能测试多种格式输出

  • MarkdownExporter:导出Markdown格式。
  • AsciiDocExporter:导出AsciiDoc格式。
  • HtmlExporter:导出HTML格式。
  • CsvExporter:导出CSV(逗号分隔值)格式。
  • RPlotExporter:导出R绘图文件格式。
[MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter]
public class HashFunctionsBenchmark
{
}

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

相关文章
|
21天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
74 13
在.NET Workflo“.NET研究”w 3.5中使用多线程提高工作流性能
  最近在工作上碰到一个性能问题,由于项目是基于SOA的架构,使得整个系统完全依赖于各种各样的Serv上海闵行企业网站制作ice,其中用于处理业务逻辑的Business Services全部都用.NET Workflow 3.5实现(历史原因,项目还没升级到Workflow 4)。
955 0
|
Java .NET
.Net D“.NET技术”iscovery系列-深入理解平台机制与性能影响(上)
  转眼间《.Net Discovery》系列文章已经推出1年了,本文为该系列的第10-13篇文章,在本文中将对以前所讲的.Net平台知识做一个小小的总结与机制分析,引出并重点介绍这些机制对程序性能的影响与改进建议。
1209 0
|
SQL .NET
.NET“.NET研究” 4 并行(多核)编程系列之一入门介绍
  本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍。   本篇文章的议题如下:   1. 并行编程和多线程编程的区别。   2. 并行编程技术的利弊   3. 何时采用并行编程   1.并行编程和多线程编程的区别。
862 0
|
.NET C#
.“.NET研究”Net Discovery系列之-深入理解平台机制与性能影响 (中)
  上一篇文章中Aicken为大家介绍了.Net平台的垃圾回收机制与其对性能的影响,这一篇中将继续为大家介绍.Net平台的另一批黑马—JIT。有关JIT的机制分析   ● 机制分析以C#为例,在C#代码运行前,一般会经过两次编译,第一阶段是C#代码向MSIL的编译,第二阶段是IL向本地代码的编译。
1070 0
|
SQL .NET
一起谈.NET技术,.NET 4 并行(多核)编程系列之一入门介绍
  本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍。   本篇文章的议题如下:   1. 并行编程和多线程编程的区别。   2. 并行编程技术的利弊   3. 何时采用并行编程   1.并行编程和多线程编程的区别。
993 0
.NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  前言:我们一步步的从简单的开始讲述,还是沿用我一直的方式:慢慢演化,步步为营。 本篇文章的议题如下:   1.Task基础介绍   2.Task的创建   3.获取Task的执行结果   4. 补充细节   1.Task基础介绍   首先我们还是来看看一段简单的代码:   这里展示的只是一段简单的代码,不能显示出并行编程的特点。
879 0
|
算法 Java 测试技术
官方文档:Androi“.NET研究”d应用程序运行的性能设计
  Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航。由此,它必须是高效的。电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了。由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序。
1102 0
浅析.“.NET研究”NET开发过程中命名的数量和人称
  我们都明白命名的重上海闵行企业网站制作lor:white;' href='http://www.93tj.com'>上海企业网站制作要性,如果对命名不断地关注,就需要考虑命名中的动词和名词,特别的情况是动词的人称和名词的数量。
771 0