前言
嗨,小伙伴们,今天我们来聊聊一个在 C# 程序员中越来越受欢迎的工具:Benchmark.NET
。
这是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。
简单来说,它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!
比如我们都知道,字符串拼接时,StringBuilder 性能要高得多,速度也快得多,如果有人质疑,我们就可以使用 Benchmark.NET
生成的性能报告来怼他。
是不是听起来很酷?那么,让我们一起通过一个 Step By Step 例子来探索 Benchmark.NET
的奥秘吧!
Step By Step 步骤
新建一个 .NET Core 控制台应用程序,命名为
BenchmarkSample
安装 Benchmark.NET Nuget 包
BenchmarkDotNet
新建一个 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(); } } }
打开
Program.cs
文件,添加以下代码:using BenchmarkDotNet.Running; using BenchmarkSample; // 运行 BenchmarkTest 里标记为 Benchmark 的方法,比较它们的性能 var summary = BenchmarkRunner.Run<BenchmarkTest>(); Console.WriteLine(summary);
运行基准测试,注意:
- 运行前需要先切换到 Release 模式
- 运行大约需要几分钟,基准测试工具会在后台创建大量线程/作业并多次运行测试
大约几分钟后,基准测试工具在屏幕上打印出以上代码的性能报告,如下图:
你可以清楚地看到每个方法的执行时间和内存分配,很明显,方法 `TestMethod2` 的性能和执行速度要高很多!
性能报告指标说明:
Mean:平均运行时间,是所有运行中的平均值
Error:测试结果的标准差,值越小,说明测试结果越可靠和稳定
StdDev:测试结果的标准偏差,值越小,说明数据的波动越小,数据分布越稳定
Allocated:每个操作分配的内存大小
通常需要关注 Mean
、Error
和 Allocated
这三个指标,它们可以帮助评估方法的性能、执行速度和准确性。
优势
通过以上的例子,你感觉到 Benchmark.NET
的优势了吗?总结一下:
精准测量:Benchmark.NET 提供了高精度的性能测量,能够消除许多常见的干扰因素,比如 JIT 编译、垃圾回收等。
易于使用:只需几行代码,你就能开始基准测试,简单明了,适合各种水平的开发者。
丰富的报告:它生成的报告详细而美观,帮助你清晰地了解性能数据,方便分析和优化。
跨平台:支持 .NET Core 和 .NET Framework,适用于 Windows、Linux 和 macOS 等操作系统。
使用建议
- 使用时确保测试环境尽可能一致,避免外部因素干扰测试结果
- 为了获得更准确的结果,建议多次运行基准测试,取平均值
- 测试时不仅要关注执行时间,还要注意内存使用情况
总结
Benchmark.NET 是一个非常简单和实用的工具,当你有以下的需求时,它是一个很好的选择:
当你想要优化某段代码的性能时
想知道哪个算法更快时
在重构代码后,想要知道性能有没有比重构之前更好
在使用第三方库时,想知道其性能是否符合需求
最后,希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
记住,性能测试是一个持续的过程,随着应用的发展不断优化,才能让应用始终保持最佳状态!
往期精彩
- C# 静态类,高手不想让你知道的 15 个真相
- 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
- 用 C# Stopwatch 计时,让代码性能飞起来!
- 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
- 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
- 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
- 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
- C# AutoMapper 10个常用方法总结
- C# 7个方法比较两个对象是否相等
- C# 去掉字符串最后一个字符的 4 种方法
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来!