详解如何使用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#测试本机sql运算速度的代码示例分享

    c#测试本机sql运算速度的代码示例分享

    本文代码目的很简单,就是使用c#测试一下本机sql运算的速度,使用循环往数据里大量插入数据,计算所用时间,大家参考使用吧
    2014-01-01
  • c#基础系列之ref和out的深入理解

    c#基础系列之ref和out的深入理解

    有过C#基础知识的都应该清楚Ref和Out的使用方法,所以下面这篇文章主要给大家介绍了关于c#基础系列之ref和out的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-09-09
  • 利用C#代码将html样式文件与Word文档互换的方法

    利用C#代码将html样式文件与Word文档互换的方法

    这篇文章主要给大家介绍了关于利用C#代码将html样式文件与Word文档互换的方法,文中通过示例代码将两种转换介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • 浅谈C#.NET、JavaScript和JSON

    浅谈C#.NET、JavaScript和JSON

    本文介绍了C#.NET、JavaScript和JSON的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 详解C#设置Excel数据自适应行高、列宽的2种情况

    详解C#设置Excel数据自适应行高、列宽的2种情况

    这篇文章主要介绍了C#设置Excel数据自适应行高、列宽的2种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解C# 不能用于文件名的字符

    详解C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符,那么具体是包括哪些符号不能作为文件名呢?下面小编给大家介绍下
    2018-02-02
  • C#将Json解析成DateTable的方法

    C#将Json解析成DateTable的方法

    这篇文章主要介绍了C#将Json解析成DateTable的方法,涉及相关格式转换的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C# 输出参数out问题

    C# 输出参数out问题

    这篇文章主要介绍了C# 输出参数out问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 解决C# 截取当前程序窗口指定位置截图的实现方法

    解决C# 截取当前程序窗口指定位置截图的实现方法

    本篇文章是对C#中截取当前程序窗口指定位置截图的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#文件流读写和进度回调示例详解

    C#文件流读写和进度回调示例详解

    这篇文章主要给大家介绍了关于C#文件流读写和进度回调的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03

最新评论