如何使用 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,一经查实,立即删除!

相关文章

MSSQL 2008 企业管理器打开命令

MSSQL 2008 Server做了一些调整&#xff0c;取数据是按照200或者1000条查看&#xff0c;对权限控制的更加严格&#xff0c;已经去掉可以添加用户的那个存储过程。同时在启动实例时也加强权限的限制&#xff0c;如果没有权限那么将无法打开。 在MSSQL 2008 Server中如果想通过命…

笑说设计模式-小白逃课被点名

简介 工厂模式&#xff08;Factory Pattern&#xff09;是最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;而是通过使用一个共同的接口来…

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

论文的重要加分点除了内容&#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实际应用的问题…

powerpc-linux-gcc,关于powerpc-linux-uclibc-gcc的使用

做了点东西需要使用linux下ldap库&#xff0c;我装的linux上已经有ldap库&#xff0c;在程序中#include 了。用gcc编译时&#xff1a;gcc filename.c,会报找不到ldap.h文件以及ldap.h文件中相关函数的错误但是使用gcc filename.c -lldap&#xff0c;就能够编译通过了。后来要求…

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

「魔镜魔镜告诉我&#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 中文的翻译&…

linux 连接wifi wpa2,RHEL等Linux系统使用wpa_supplicant以WPA-PSK/WPA2-PSK连接WIFI

以RHEL6.4为实验对象&#xff1a;1、安装 wpa_supplicant.yum install wpa_supplicant2、编辑 wpa_supplicant 配置文件vim /etc/sysconfig/wpa_supplicant以下格式&#xff1a;# Use the flag "-i" before each of your interfaces, like so:# INTERFACES"-ie…

如何在 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;可惜的是…

通信开源linux,Linux环境进程间通信

Linux环境进程间通信(一)http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.htmlLinux环境进程间通信(二): 信号(上)http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.htmlLinux环境进程间通信(二): 信号(下)http://www.ibm.com/developerworks/cn…

真人拳皇项目Alpha阶段的回顾——史经浩

经过一个多月艰辛的努力&#xff0c;我们小组终于在1/14按时发布了真人拳皇的alpha版。按照计划&#xff0c;这一周是总结过去这段时间的经验教训&#xff0c;为即将到来的beta阶段作准备。回顾刚刚过去的一个多月&#xff0c;从plan阶段的天马行空&#xff0c;到后来的逐渐降级…

在栈中压入一个字符串c语言,面试题 31:栈的压入、弹出序列

题目描述输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xff0c;序列4,5,3,2,1是该压栈序列对应的一个弹出序列&#xff0c;但4,3,5,1,…

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

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

关于perl和shell的参数传递

Perl 1.命令行参数传递 *Perl **ARGV $_ARGV[0] $#ARGV为参数的个数-1 ($#array 只适用于array不适用%hash) *Shell $1 $2 参数个数$#(不用减1,是否可以用来判断是否有命令行参数&#xff1f;) 2.函数参数传递 *Perl **_ 传递了所有的函数参数。如果是对象中的方法。$_[0] 是…

NET问答:如何理解 IEnumerableT 和 IQueryableT

咨询区 stackoverflowuser&#xff1a;请问类型 IQueryable<T> 和 IEnumerable<T> 有什么异同&#xff1f;我应该使用哪一个而不是另一个&#xff0c;代码如下&#xff1a;IQueryable<Customer> custs from c in db.Customers where c.City "<Cit…

c语言实现字母转化为unicode码,用C语言实现中文到unicode码的转换

由于本人喜欢用Notepad编辑器&#xff0c;该编辑器的好处是小巧灵活&#xff0c;但是有几个地方做的不足&#xff0c;但是我都能够很好的采取相应的措施来替代&#xff0c;下面让我们看看Notepad有哪些地方的不足&#xff0c;进而采取怎样的措施。一&#xff1a;Notepad不能编译…