开发者

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

开发者 https://www.devze.com 2025-04-01 14:57 出处:网络 作者: 追逐时光者
目录前言项目介绍项目特性创建控制台应用安装 NuGet 包进行性能基准测试HashFunctionsBenchmark运行基准测试分析生成的报告说明报告分析性能测试多种格式输出前言
目录
  • 前言
  • 项目介绍
  • 项目特性
  • 创建控制台应用
  • 安装 NuGet 包
  • 进行性能基准测试
    • HashFunctionsBenchmark
    • 运行基准测试
    • 分析生成的报告
    • 说明
    • 报告分析
  • 性能测试多种格式输出

    前言

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

    项目介绍

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

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

    项目特性

    • 支持的语言: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控制台应用。

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

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

    安装 NuGet 包

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

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

    进行性能基准测试

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

    HashFunctionsBenchmark

        [MemoryDiagnoser]//记录内存分配情况
        public class HashFunctionsBenchmark
        {
            private readonly string _inputData;
    
            public HashFunctionsBenchmark()
            {
        javascript        // 使用一个较长的字符串作为输入,以更好地反映哈希函数的性能
                _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 android;(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.

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

    分析生成的报告

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

    说明

    • 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.2656javascript197.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.android92 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代码进行性能基准测试

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

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号