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

 更新时间:2024年12月23日 08:37:15   作者:追逐时光者  
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 秒)。

报告分析

MethodMeanErrorStdDevGen0Gen1Gen2Allocated
MD5Hash1.952 ms0.0169 ms0.0158 ms197.2656197.2656197.2656976.9 KB
SHA256Hash3.907 ms0.0157 ms0.0147 ms195.3125195.3125195.3125976.93 KB
SHA1Hash1.780 ms0.0231 ms0.0193 ms197.2656197.2656197.2656976.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
{
}

到此这篇关于详解如何使用BenchmarkDotNet对.NET代码进行性能基准测试的文章就介绍到这了,更多相关BenchmarkDotNet .NET代码性能基准测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#异步原理详情

    C#异步原理详情

    这篇文章主要介绍了C#异步原理,C#异步在C#5便发布了,是利用async关键字和await表达式表达的异步操作,下面文章下边将详细向大家介绍C#异步原理,感兴趣得小伙伴可以参考一下
    2021-10-10
  • C#获取动态生成的CheckBox值

    C#获取动态生成的CheckBox值

    checkbox是VS2012的常用控件之一,可以方便的为某些功能取消或启用,下面教你如何简单使用checkbox。本文通过两种方法给大家介绍,需要的朋友一起看看吧
    2015-09-09
  • C#文件读写操作详细操作指南

    C#文件读写操作详细操作指南

    这篇文章主要给大家介绍了关于C#文件读写操作详细操作指南,在后端开发中使用C#语言进行文件操作是一个常见的任务,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • C# 编码好习惯,献给所有热爱c#的同志

    C# 编码好习惯,献给所有热爱c#的同志

    c#编写者,需要培养的一些好习惯
    2009-02-02
  • c# 接口使用实例

    c# 接口使用实例

    这篇文章主要介绍了c#接口使用的实例,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C# 任务的异常和延续处理

    C# 任务的异常和延续处理

    本文主要介绍了C# 任务的异常和延续处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例

    C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例

    这篇文章主要介绍了C#实现DataSet内数据转化为Excel和Word文件的通用类,涉及C#中DataSet控件的使用及Excel和Word文件的相关操作技巧,需要的朋友可以参考下
    2016-06-06
  • C#如何操作Excel数据透视表

    C#如何操作Excel数据透视表

    这篇文章主要为大家详细介绍了C#如何操作Excel数据透视表, 创建透视表、设置行折叠、展开等操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • C#继承IList 接口的实现步骤

    C#继承IList 接口的实现步骤

    C#中的IList<T>接口是.NET框架中的一种通用接口,它定义了一组在运行时可以使用类型参数T的元素的集合,本文给大家介绍了C#继承IList 接口的设计方法,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • 基于C#实现简单的随机抽奖小程序

    基于C#实现简单的随机抽奖小程序

    临近春节,大街小巷的地方都有抽奖活动,那么基于C#是如何实现简单的抽奖程序的呢,下面小编给大家分享了具体代码,有需要的朋友参考下
    2016-01-01

最新评论