如何使用 BenchmarkDotNet 对 C# 代码进行基准测试

BenchmarkDotNet 是一个轻量级,开源的,强大的 .NET 工具包,它可以将你的方法转化为基准并跟踪这些方法,最后对这些方法的性能提供一些测试报告,使用 BenchmarkDotNet 玩 基准测试 是非常容易的。

你可以利用 BenchmarkDotNet 在 .NET Framework 和 .NET Core 应用程序上实现基准测试,在这篇文章中,我们将会讨论如何在 .NET Core 中实现基准测试。

安装 BenchmarkDotNet

要想使用 BenchmarkDotNet,要么通过 Nuget 可视化窗口安装 BenchmarkDotNet,要么使用NuGet Package Manager Console 命令行窗口输入如下命令。


Install-Package BenchmarkDotNet

什么是基准测试

基准测试 是对应用程序的一段代码的性能提供一个或者一组度量值,度量代码本质上来说就是让你清楚的了解你的应用程序的性能到底是怎么样的,当你想优化代码的时候,如果手边有这些性能度量值那该有多好呀~ 基准测试也可以帮助我们缩小到那些必须要重构的代码。

创建基准测试代码

新建 BenchmarkDotNet 类,类定义如下

[MemoryDiagnoser]public class MemoryBenchmarkerDemo{int NumberOfItems = 100000;[Benchmark]public string ConcatStringsUsingStringBuilder(){var sb = new StringBuilder();for (int i = 0; i < NumberOfItems; i++){sb.Append("Hello World!" + i);}return sb.ToString();}[Benchmark]public string ConcatStringsUsingGenericList(){var list = new List<string>(NumberOfItems);for (int i = 0; i < NumberOfItems; i++){list.Add("Hello World!" + i);}return list.ToString();}}

上面的代码展示了如何做 基准测试, 做法很简单,在方法上标记 Benchmark 特性即可,接下来就可以 Main 方法中启动 基准测试,代码如下:


static void Main(string[] args)
{var summary = BenchmarkRunner.Run<MemoryBenchmarkerDemo>();
}

运行 benchmark

值得注意的是,一定要用 release 模式运行,如果用debug的话,会抛如下错误的。

调整为 release 模式后,将程序跑起来,要稍微跑一段时间,最后将会看到 console 输出如下的 summary。

从图中可以看到,summary中会包含比如:BenchmarkDotNet版本,操作系统,计算机硬件,.NET版本,编译器信息和一些应用程序相关的性能信息,从图中也可以看出 ConcatStringUsingStringBuilder 方法比  ConcatStringUsingGenericList 方法性能更高,付出的代价就是占用更多的内存。

接下来在 MemoryBenchmarkerDemo 类上标注 RankColumn 标记,这样会在输出结构中多一个给程序排名的 Rank 列,修改代码如下:

[MemoryDiagnoser, RankColumn]public class MemoryBenchmarkerDemo{...}

接下来再将程序跑起来,观察最后的 summary,可以清楚的看到多了一个 Rank 列。

BenchmarkDotNet 提供了一种简单的方式让你拥有了对应用程序的性能知情权,如果你想了解更多关于如何在 ASP.NET Core 中使用 BenchmarkDotNet,参考github:https://github.com/aspnet/benchmarks

译文链接:https://www.infoworld.com/article/3573782/how-to-benchmark-c-code-using-benchmarkdotnet.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原来论文排版还有这样的学问

论文的重要加分点除了内容&#xff0c;还有它小天最近经常遇到小伙伴的诉苦&#xff1a;“我的毕业论文提交一次就被导师批评一次&#xff0c;内容不行就算了&#xff0c;格式也有问题&#xff01;改论文改到绝望”“期刊的版式要求不是统一的&#xff0c;为了多投几家&#xf…

红帽linux5安装Oracle 9i enterprise

红帽linux5安装Oracle 9i enterprise 本文转自&#xff1a;http://database.51cto.com/art/201004/194082.htm摘要&#xff1a;如果你在红帽Linux5上安装Oracle 9i enterprise遇到了问题&#xff0c;不防看一看下面的文章&#xff0c;希望能帮你解决有关Oracle9i实际应用的问题…

神经网络告诉我,谁是世界上最「美」的人?

「魔镜魔镜告诉我&#xff0c;谁是世界上最美的女人&#xff1f;」这句伴随童年的话也有现实版哦&#xff5e;神经网络可以预测人脸颜值&#xff0c;这方面也出现了不少研究。今年年初华南理工大学的研究者发布论文&#xff0c;并公开了数据集 SCUT-FBP5500。本文作者 Dima Shu…

开源推荐:.Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统

ASP.NET Core是一个由微软创建的&#xff0c;用于构建Web应用程序&#xff0c;API&#xff0c;微服务的Web框架。它使用常见的模式&#xff0c;例如MVC&#xff08;模型-视图-控制器&#xff09;&#xff0c;依赖注入&#xff0c;和一个由中间件构成它基于Apache 2.0许可开放源…

android中文api(85)——HorizontalScrollView

前言 本章内容是android.widget.HorizontalScrollView&#xff0c;译为"横向滚动条"&#xff0c;版本为Android 2.3 r1&#xff0c;翻译来自"Tina"&#xff0c;感谢"Tina"为大家带来精彩的翻译稿 &#xff01;期待你加入Android API 中文的翻译&…

如何在 C# 中使用只读的 Collections

集合 表示一组可用于获取和存储的对象&#xff0c;在 C# 中提供了两种类型的集合。普通集合泛型集合前者存在于 System.Collections 命名空间下&#xff0c;属类型不安全的&#xff0c;后者存在于 System.Collections.Generic 命名空间下&#xff0c;属类型安全的。不可变对象 …

操作系统和数据库的知识梳理(思维导图)

使用思维导图工具 freemind 提供下载 源码文件和 Java网页版 http://files.cnblogs.com/facingwaller/osanddb.rar

令人难以理解的软件工程师:几千行代码能搞定的为什么要写几万行?

一我们公司的 Windows 版软体已经有十多年的历史&#xff0c;经过历代工程师的整治之后&#xff0c;内容已经凌乱不堪。过去三个月&#xff0c;我找时间自己重写了整个主程序。原本数万行的程序&#xff0c;被我重写的只剩下数千行&#xff0c;功能不变&#xff0c;效能更好&am…

如何从 dump 文件中提取出 C# 源代码?

一&#xff1a;背景 相信有很多朋友在遇到应用程序各种奇葩问题后&#xff0c;拿下来一个dump文件&#xff0c;辛辛苦苦分析了大半天&#xff0c;终于在某一个线程的调用栈上找到了一个可疑的方法&#xff0c;但 windbg 常常是以 汇编 的方式显示方法代码的&#xff0c;可惜的是…

谈谈对IOC及DI的理解与思考

一、前言在实际的开发过程中&#xff0c;我们经常会遇到这样的情况&#xff0c;在进行调试分析问题的时候&#xff0c;经常需要记录日志信息&#xff0c;这时可以采用输出到控制台。因此&#xff0c;我们通常会定义一个日志类&#xff0c;来实现输出日志。定义一个生成验证的逻…

终于有人把云计算、大数据和人工智能讲明白了!

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢&#xff1f;因为这三个东西现在非常火&#xff0c;并且它们之间好像互相有关系&#xff1a;一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

聊一聊如何在.NET Core中使用Nacos 2.0

前言 随着 nacos 2.0.0 正式发布&#xff0c;老黄这边也跟着发布了 1.0.2 版本的 nacos-sdk-csharp。下面简单聊一下相关的使用。纯 SDK 的使用 首先要安装 nuget 包<PackageReference Include"nacos-sdk-csharp" Version"1.0.2" />这里有一点要注意…

听说你刚转了Java?准备转回.NET吧!

牛年跳槽季如火如荼&#xff0c;敏锐点的小伙伴儿应该都留意到了&#xff0c;BAT新年都在招聘.NET。2020年11月份发布.NET5统一了七大应用方向&#xff0c;.NET6的2个预览版已经把Blazor升级、跨平台UI方案MAUI、CLR性能优化等都放出来了&#xff0c;.NET前景充满想象&#xff…

一个人开始废掉的3种迹象

1作家李尚龙说&#xff1a;“在大城市里&#xff0c;搞废一个人的方式特别简单。给你一个安静狭小的空间&#xff0c;给你一根网线&#xff0c;最好再加一个外卖电话。好了&#xff0c;你开始废了。”之前的我并不相信人会这么轻易地堕落&#xff0c;直到身边出现了一个真实的例…

WPF 动态更换图片路径

wpf中动态修改图片路径&#xff0c;其实很简单&#xff0c;有个小伙伴有疑问&#xff0c;绑定了source,为什么不能显示图片呢。。。通过绑定&#xff0c;修改图片路径&#xff0c;动态显示图片&#xff0c;效果如下&#xff1a;图片支持本地路径和网络路径&#xff0c;下面就来…

听说你在学习算法?清华教授为你准备了一份独家秘籍!

也许您渴望进入国内外IT名企&#xff0c;却屡屡在算法类面试中折戟&#xff0c;苦恼不知如何破解困境&#xff1b;也许您是一位IT工程师&#xff0c;却因为算法能力不足而错过无数次的升职加薪&#xff0c;困扰不知如何突破瓶颈&#xff1b;也许您是一位大学生/中学生&#xff…

用VirtualWifi软件实现无线网卡同时连接多个AP。

2019独角兽企业重金招聘Python工程师标准>>> 用VirtualWifi软件实现无线网卡同时连接多个AP。 随着信息技术的发展&#xff0c;越来越多的人开始使用便捷的无线路由器&#xff08;AP&#xff09;组建家庭局域网。当你发现你周围有多个AP可以连接的时候&#xff0c;是…

机器学习萌新必学的Top10算法

导读&#xff1a;在机器学习领域里&#xff0c;不存在一种万能的算法可以完美解决所有问题&#xff0c;尤其是像预测建模的监督学习里。所以&#xff0c;针对你要解决的问题&#xff0c;最好是尝试多种不同的算法。并借一个测试集来评估不同算法之间的表现&#xff0c;最后选出…

分支结构程序案例c语言,C语言学习之三——分支结构程序

运算符优先级&#xff1a;如下所示&#xff1a;image.png关系运算符和表达式关系运算符定义&#xff1a;在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。因此使用关系运算符进行比较(注&#xff1a;比较后的返回值为boolean值&#xff0c;即0或1(真为1&#xf…

诺基亚首款Windows Phone智能手机将在年内推出

诺基亚高级官员星期日称&#xff0c;第一款采用微软Windows Phone操作系统的诺基亚智能手机的目标发布日期将在几天之内确定下来。诺基亚的目标是在将这种手机推向市场。诺基亚负责智能设备的执行副总裁乔哈洛&#xff08;Jo Harlow&#xff09;称&#xff0c;诺基亚和微软的技…