Benchmark.NET:让 C# 测试程序性能变得既酷又简单

简介: Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!

Coding-90.png

前言

嗨,小伙伴们,今天我们来聊聊一个在 C# 程序员中越来越受欢迎的工具:Benchmark.NET

这是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。

简单来说,它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!

比如我们都知道,字符串拼接时,StringBuilder 性能要高得多,速度也快得多,如果有人质疑,我们就可以使用 Benchmark.NET 生成的性能报告来怼他。

是不是听起来很酷?那么,让我们一起通过一个 Step By Step 例子来探索 Benchmark.NET 的奥秘吧!

Step By Step 步骤

  1. 新建一个 .NET Core 控制台应用程序,命名为 BenchmarkSample

  2. 安装 Benchmark.NET Nuget 包

    BenchmarkDotNet

  3. 新建一个 BenchmarkTest.cs 类文件

    在这个类文件中编写基准测试代码(留意注释

     using BenchmarkDotNet.Attributes;
     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using System.Threading.Tasks;
    
     namespace BenchmarkSample
     {
         
         // [MemoryDiagnoser] 特性用于查看内存分配情况,不加也可以,但结果没有 Allocated 指标
         [MemoryDiagnoser]
         public class BenchmarkTest
         {
         
             // [Benchmark] 特性标识需要进行性能测试的方法
             [Benchmark]
             public string TestMethod1()
             {
         
                 // 循环 1000 次,使用 String 的原始方式来拼接字符串
                 string result = "";
                 for (int i = 0; i < 1000; i++)
                 {
         
                     result += "Hello ";
                 }
                 return result;
             }
    
             [Benchmark] 
             public string TestMethod2()
             {
         
                 // 循环 1000 次,使用 StringBuilder 来拼接字符串
                 StringBuilder sb = new StringBuilder(1024);
                 for (int i = 0; i < 1000; i++)
                 {
         
                     sb.Append("Hello ");
                 }
                 return sb.ToString();
             }
         }
     }
    
  4. 打开 Program.cs 文件,添加以下代码:

     using BenchmarkDotNet.Running;
     using BenchmarkSample;
    
     // 运行 BenchmarkTest 里标记为 Benchmark 的方法,比较它们的性能
     var summary = BenchmarkRunner.Run<BenchmarkTest>();
     Console.WriteLine(summary);
    
  5. 运行基准测试,注意:

    • 运行前需要先切换到 Release 模式
    • 运行大约需要几分钟,基准测试工具会在后台创建大量线程/作业并多次运行测试
  6. 大约几分钟后,基准测试工具在屏幕上打印出以上代码的性能报告,如下图:

    Coding-94.png

你可以清楚地看到每个方法的执行时间和内存分配,很明显,方法 `TestMethod2` 的性能和执行速度要高很多!

性能报告指标说明:

  1. Mean:平均运行时间,是所有运行中的平均值

  2. Error:测试结果的标准差,值越小,说明测试结果越可靠和稳定

  3. StdDev:测试结果的标准偏差,值越小,说明数据的波动越小,数据分布越稳定

  4. Allocated:每个操作分配的内存大小

通常需要关注 MeanErrorAllocated 这三个指标,它们可以帮助评估方法的性能、执行速度和准确性。

优势

通过以上的例子,你感觉到 Benchmark.NET 的优势了吗?总结一下:

  1. 精准测量:Benchmark.NET 提供了高精度的性能测量,能够消除许多常见的干扰因素,比如 JIT 编译、垃圾回收等。

  2. 易于使用:只需几行代码,你就能开始基准测试,简单明了,适合各种水平的开发者。

  3. 丰富的报告:它生成的报告详细而美观,帮助你清晰地了解性能数据,方便分析和优化。

  4. 跨平台:支持 .NET Core 和 .NET Framework,适用于 Windows、Linux 和 macOS 等操作系统。

使用建议

  1. 使用时确保测试环境尽可能一致,避免外部因素干扰测试结果
  2. 为了获得更准确的结果,建议多次运行基准测试,取平均值
  3. 测试时不仅要关注执行时间,还要注意内存使用情况

总结

Benchmark.NET 是一个非常简单和实用的工具,当你有以下的需求时,它是一个很好的选择:

  1. 当你想要优化某段代码的性能时

  2. 想知道哪个算法更快时

  3. 在重构代码后,想要知道性能有没有比重构之前更好

  4. 在使用第三方库时,想知道其性能是否符合需求

最后,希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!

记住,性能测试是一个持续的过程,随着应用的发展不断优化,才能让应用始终保持最佳状态!

往期精彩

  1. C# 静态类,高手不想让你知道的 15 个真相
  2. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  3. 用 C# Stopwatch 计时,让代码性能飞起来!
  4. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  5. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  6. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  7. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  8. C# AutoMapper 10个常用方法总结
  9. C# 7个方法比较两个对象是否相等
  10. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来!

相关文章
|
19天前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 优化与性能提升
本文介绍了 GraphQL API 的常见性能问题及优化方法,包括解决 N+1 查询问题、避免过度取数据、合理使用缓存及优化解析器性能,提供了 C# 实现示例。
67 33
|
27天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
1月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
27 5
|
1月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
36 4
|
1月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
39 3
|
1月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
36 3
|
1月前
|
人工智能 Java 编译器
.NET 9 发布 性能提升、AI 支持与全方位改进
【11月更文挑战第5天】.NET 9 引入了多项改进,包括性能提升、AI 支持和全方位功能优化。性能方面,编译器增强、服务器 GC 优化、矢量化和硬件支持等提升了执行效率。AI 方面,新增学习材料、合作伙伴生态、原生支持和生成式 AI 集成。此外,.NET Aspire 组件升级、编程语言新功能和开发工具更新进一步提升了开发体验。
|
1月前
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
59 7
|
1月前
|
Kubernetes 测试技术 持续交付
C# 一分钟浅谈:集成测试与系统测试
【10月更文挑战第19天】本文详细介绍了集成测试和系统测试的概念、目的及其在软件开发中的重要性。通过分析常见问题和易错点,结合代码示例,探讨了如何通过代码规范、自动化测试和持续集成等方法提高测试效果,确保软件质量和可靠性。
104 1
|
10天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
51 11