首页 > 其他分享 >使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试

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

时间:2024-11-27 13:11:43浏览次数:5  
标签:ms 项目 性能 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
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
{
}

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看

标签:ms,项目,性能,BenchmarkDotNet,测试,NET,基准
From: https://www.cnblogs.com/mq0036/p/18572143

相关文章

  • 一个整合性、功能丰富的.NET网络通信框架
    前言最近有不少同学问:.NET网络通信框架有什么好推荐的吗?今天大姚给大家分享一款基于ApacheLicense开源的一个整合性、功能丰富的.NET(包括C#、VB.Net、F#)网络通信框架:TouchSocket。特色功能一键解决TCP黏分包问题,提供协议模板,支持快速实现固定包头、固定长度、区间字符......
  • .NET9 - Swagger平替Scalar详解(四)
    书接上回,上一章介绍了Swagger代替品Scalar,在使用中遇到不少问题,今天单独分享一下之前Swagger中常用的功能如何在Scalar中使用。下面我们将围绕文档版本说明、接口分类、接口描述、参数描述、枚举类型、文件上传、JWT认证等方面详细讲解。01、版本说明我们先来看看默认添加后是......
  • Nettt核心之Future与Promise
    在了解Future之前要明白线程同步和异步线程同步需要等待,线程异步无需等待Netty中的Future机制1,基于jdkFuture改造而来2,保留了同步获取结果的能力,也提供了异步的Listener机制Netty中的Future:Netty自己实现的Future继承了|DK的Future,新增了Listener机制,任务结束会回......
  • 使用Net在Linux环境下调用PowerShell
    前言最近,在使用PowerShell做一些事情,然后需要放到AKS运行。正文一开始,使用的System.Management.Automation调用PowerShell,后来,发现有些功能在AKS下面执行不了,后面才想到使用Process的方式,如下:publicvoidExecutePowerShell(stringscript){try{......
  • PasteEx:一款.NET开源的Windows快捷粘贴神器
    前言PasteEx是一款.NET开源的用于增强Windows粘贴功能的小工具,它解决了将剪贴板内容保存为文件的繁琐步骤。无需打开记事本等应用,它可直接将文字、图片等内容粘贴到桌面上,极大提升了效率。功能特点自定义文本扩展规则:用户可以设置特定的文本扩展规则,以满足不同文件格式的需......
  • Steering Control Based on Frenet-Serret Error Model
    Thekinematicmodelofthevehicleistypicallydescribedbythebicyclemodelasfollows:{......
  • AGI 视界周刊11月第3周:马斯克与OpenAI分歧始末曝光、星舰第六次试验成功实现太空重启
    AGI视界周刊由AGI掘金知识库共建者战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、智见交锋、跨界AI、企业动态和争议AI七大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出。欢迎大家来到《AGI视界周刊10月第3周》(11/18~11/24)。......
  • .NET9 EFcore支持早期MSSQL数据库 ROW_NUMBER()分页
    前言NET程序员是很幸福的,MS在上个月发布了NET9.0RTM,带来了不少的新特性,但是呢,我们是不是还有很多同学软硬件都还没更上,比如,自己的电脑还在跑Win7,公司服务器还在跑MSSQL2005-2008的!这不就引入了我们本文要探索的问题,因为MS早在EFcore3.1后就不再内置支持ROW_NUMBER()了,......
  • asp.net实现微信支付综合管理平台前端页面(支付、订单查询、退款、退款查询)
    <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index4V2.aspx.cs"Inherits="WXPayDemo.index4V2"%><!DOCTYPEhtml><htmlxmlns="http://www.w3.org/1999/xhtml"><headrunat=&q......
  • 如何在ixBrowser中添加并使用Netnut
    如何在ixBrowser中添加并使用Netnut步骤1:首先进入Netnut官网,点击进入工作台,若你已经购买了代理,你可以在上方选择代理类型,国家,输入目标访问地址,并获取去代理信息;步骤2:打开ixBrowser,点击创建窗口,选择平台并输入窗口信息;步骤3:点击下一步进入代理配置界面,选择代理方式为自定......