Benchmark.NET:让 C# 测试程序性能变得既酷又简单
前言
嗨,小伙伴们,今天我们来聊聊一个在 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 是一个非常简单和实用的工具,当你有以下的需求时,它是一个很好的选择:
-
当你想要优化某段代码的性能时
-
想知道哪个算法更快时
-
在重构代码后,想要知道性能有没有比重构之前更好
-
在使用第三方库时,想知道其性能是否符合需求
最后,希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
记住,性能测试是一个持续的过程,随着应用的发展不断优化,才能让应用始终保持最佳状态!
往期精彩
- 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
- 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!!