首页 > 其他分享 >使用 Benchmark.NET 测试代码性能

使用 Benchmark.NET 测试代码性能

时间:2023-07-03 20:32:39浏览次数:45  
标签:StringBuilder 基准 Benchmark 测试 测试代码 sb NET Append

今天,我们将研究如何使用Benchmark.Net来测试代码性能。借助基准测试,我们可以创建基准来验证所做的更改是否按预期工作并且不会导致性能下降。 并非每个项目都需要进行基准测试,但是如果您正在开发的是NuGet程序包或通用dll,则很有意义。

使用 Benchmark.NET 测试代码性能_基准测试

 

今天,我们将研究如何使用Benchmark.Net来测试代码性能。借助基准测试,我们可以创建基准来验证所做的更改是否按预期工作并且不会导致性能下降。

并非每个项目都需要进行基准测试,但是如果您正在开发的是NuGet程序包或通用dll,则很有意义。我们将使用它来解决一个古老的问题,字符串拼接,比如下面这样:

string myString = "string1" + "string2" + "string3" + "string4" + "string5";
Console.WriteLine(myString);

我们很多人都知道建议使用StringBuilder作为替代方法,并且速度要快得多,特别是在您有很多字符串的情况下。

StringBuilder sb = new StringBuilder();
sb.Append("string1");
sb.Append("string2");
sb.Append("string3");
sb.Append("string4");
sb.Append("string5");
Console.WriteLine(sb.ToString());

Benchmark.NET

首先,我们需要创建一个控制台项目,BenchmarkTesting.App

使用 Benchmark.NET 测试代码性能_测试方法_02

接下来,我们添加NuGet包 BenchmarkDotNet

使用 Benchmark.NET 测试代码性能_基准测试_03

然后,修改 program.cs文件中,把可访问性改成 public

使用 Benchmark.NET 测试代码性能_测试方法_04

现在我们可以创建一些测试方法,我们直接修改program.cs, 每个测试方法都需要 [Benchmark] 特性,我创建了三个示例,分别使用+运算符,Linq的Concat函数和使用StringBuilder拼接。

使用 Benchmark.NET 测试代码性能_测试方法_05

最后,在控制台应用程序的Main入口点中,添加 BenchmarkRunning Run命令:

使用 Benchmark.NET 测试代码性能_基准测试_06

然后我们使用下边的命令运行测试,或者直接使用VS启动项目,需要切换到Release模式下

dotnet run -p BenchmarkTesting.app.csproj -c Release

运行大约需要几分钟,基准测试工具在后台创建大量线程/作业并多次运行测试,为了获得一致的结果,建议最小化打开的应用程序,并且在运行时不要执行任何其他操作,输出如下所示,其中包含很多信息。

使用 Benchmark.NET 测试代码性能_NuGet_07

单位"us"是"μs"或微秒的缩写,一微秒等于一毫秒的1/1000。

由此可见,StringBuilder要比+运算符效率更高,Linq Concat函数也相对高效,但还是没有StringBuilder快。

总结

拼接字符串时使用StringBuilder! 本篇文章只是简单作的做了介绍,Benchmark.NET是测试性能的非常强大的工具,如果需要构建Nuget包,或者开发通用类库时,这将是一种很好的测试方法。

 

原文链接:https://samlearnsazure.blog/2021/01/12/measuring-code-performance-with-benchmark-net/



作者:古道轻风


标签:StringBuilder,基准,Benchmark,测试,测试代码,sb,NET,Append
From: https://blog.51cto.com/chunyangi/6615223

相关文章

  • 如何发布符合 .NET 准则的事件
    下面的过程演示了如何将遵循标准.NET模式的事件添加到类和结构中。.NET类库中的所有事件均基于 EventHandler 委托,定义如下:publicdelegatevoidEventHandler(objectsender,EventArgse);尽管定义的类中的事件可基于任何有效委托类型,甚至是返回值的委托,但一般还是建议使用......
  • 记一次.net加密神器 Eazfuscator.NET 2023.2 最新版 使用尝试
    合集-.net代码混淆加密产权保护(2) 1.记一次.net加密神器Eazfuscator.NET2023.2最新版使用尝试06-272.将SmartAssembly与单文件可执行文件一起使用(.NETCore6)06-27收起 很多人看到这个Eazfuscator.NET还不知是什么东东。。。首先介绍下。什么是Eazfu......
  • 利用Lucene.net搜索引擎进行多条件搜索的做法
    利用Lucene.net搜索引擎进行多条件搜索的做法1联合两个索引查询,已解决:IndexSearcher[]searchers=newIndexSearcher[2];  searchers[0]=newIndexSearcher(m_indexpath);searchers[1]=newIndexSearcher(m_outindexpath);MultiSearchermultiSearcher=newMult......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
     西门子S7-1500PLC(profinet)与ABPLC以太网通讯(EtherNet/IP)。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关,连接西门子S7-1500PLC与ABPLC通讯的配置过程,供大家参考。 1,新建工程:运行RSLogix5000程序,选择菜单File->New,弹出对话框:2,在“Type”中选择控......
  • Spike timing reshapes robustness against attacks in spiking neural networks
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!同大组工作......
  • 避坑:.NET内存泄露的几种情况
    内存“泄露”是开发中常见的问题之一,它会导致应用程序占用越来越多的内存资源,最终可能导致系统性能下降甚至崩溃。软件开发者需要了解在程序中出现内存泄露的情况,以避免软件出现该的问题。什么是内存“泄露”?内存泄露是申请了内存空间的变量一直在占用,无法释放。比如申请了一块......
  • 【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY
    ChatGPT是一种基于Token数量计费的语言模型,它可以生成高质量的文本。然而,每个新账号只有一个有限的初始配额,用完后就需要付费才能继续使用。为此,我们可能存在使用多KEY的情况,并在每个KEY达到额度上限后,自动将其删除。那么,我们应该如何实现这个功能呢?还请大家扫个小关。......
  • ASP.NET Core SignalR 入门
    本章将和大家分享使用SignalR生成实时应用的基础知识。通过本文您将学习如何:使用ASP.NETCoreSignalR+MVC+Vue2.x+require最终创建一个正常运行的简易聊天应用。废话不多说,我们直接来看一个Demo,Demo的目录结构如下所示:本Demo的Web项目为ASP.NETCoreWeb应用程序(目......
  • .net core读取配置文件
    先添加这两个开发包: 这是配置文件; {"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}},"AllowedHosts":"*","......
  • dotnet-微服务学习-dotnet集成SkyWaking链路追踪
    关于链路追踪的原来我们单独开一篇文章讲解这里我们来讲解SkyWaking的安装和集成 首先进入SkyWaking官网下载最新的包网址如下: https://skywalking.apache.org/downloads/ 1.1windows安装下载后Winwos直接运行双击bin目录下的startup.bat即可 注意 SkyWalk......