当前位置: 首页 > news >正文

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

image

前言

嗨,小伙伴们,今天我们来聊聊一个在 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. 大约几分钟后,基准测试工具在屏幕上打印出以上代码的性能报告,如下图:

    image

    你可以清楚地看到每个方法的执行时间和内存分配,很明显,方法 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. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  2. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!!
image

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Java毕业设计】基于SpringBoot+Vue+uniapp的农产品商城系统
  • springboot提升-多数据源配置
  • 使用C#在指定目录下创建文件夹的全面指南
  • Adobe Illustrator非矢量图片的交集利用剪切蒙版实现
  • 设计模式应用
  • OpenCV 之 模版匹配多个对象、图片旋转 综合应用
  • Java 面试题:从源码理解 ThreadLocal 如何解决内存泄漏 ConcurrentHashMap 如何保证并发安全 --xunznux
  • 深入解析Flink SQL:基本概念与高级应用
  • 生活杂记1
  • C#基础(6)值类型和引用类型
  • 【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信
  • java 防重复提交
  • P2343 宝石管理系统
  • SpringBoot开发——整合MyBatis
  • 人工智能在C/C++中的应用
  • ➹使用webpack配置多页面应用(MPA)
  • CSS盒模型深入
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java应用性能调优
  • jdbc就是这么简单
  • 后端_MYSQL
  • 经典排序算法及其 Java 实现
  • 聊聊directory traversal attack
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小程序开发之路(一)
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一些关于Rust在2019年的思考
  • 译米田引理
  • 《码出高效》学习笔记与书中错误记录
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​linux启动进程的方式
  • #1015 : KMP算法
  • #LLM入门|Prompt#3.3_存储_Memory
  • ${factoryList }后面有空格不影响
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (六)c52学习之旅-独立按键
  • (三)Honghu Cloud云架构一定时调度平台
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • **python多态
  • .net 7 上传文件踩坑
  • .Net Core 微服务之Consul(二)-集群搭建
  • .net项目IIS、VS 附加进程调试
  • .NET性能优化(文摘)
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • @取消转义
  • [000-01-011].第2节:持久层方案的对比
  • [10] CUDA程序性能的提升 与 流
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [AIGC] 深入浅出 Python中的`enumerate`函数