BenchmarkDotNet v0.12x新增功能

起因

在看.Net 官方博客 .Net 5性能优化 中,发现测试性能的BenchmarkDotNet版本已经是v0.12.1,然后去看BenchmarkDotNet文档,发现还是有不少新的特性.

v0.12.0

  1. 支持多个运行时(API改进),增加对.Net 5支持

  2. 支持DotNet创建BenchmarkDotNet项目(项目模版)

  3. 增加NativeMemoryProfiler(目前仅支持Windows,需要在Nuget管理器中安装BenchmarkDotNet.Diagnostics.Windows包,才可以,内部使用EtwProfiler)

  4. 增加ThreadingDiagnoser

  5. 增加MemoryDiagnoser

  6. 对LINQPad 6进行支持,可以在LINQPad 6进行代码性能测试(LINQPad 要收费版才可以,这里也跳过)

  7. 文档快速搜索

v0.12.1

  1. 跨平台生成汇编代码

  2. 基于事件管道跨平台Profiler

  3. 新的API,使用更方便

支持多个运行时,新增.Net 5

<!--新增.Net 5运行时-->
<TargetFrameworks>net5.0;netcoreapp3.1;net48</TargetFrameworks>
#.netframework 4.8为基准,测试三个版本 .NetFramework 4.8/.Net Core 3.1和.Net 5
dotnet run -c Release -f net48 --runtimes net48 netcoreapp31 netcoreapp50 --filter ** --join

BenchmarkDotNet项目

先查看.Net 5下,有什么项目模版:

dotnet new -l

通过命令安装模版:

#-i 代表install
dotnet new -i BenchmarkDotNet.Templates

通过命令卸载安装过的模版:

#-u 代表卸载 u为uninsall
dotnet new -u BenchmarkDotNet.Templates

新建Benchmark项目:

#新建BenchmarkDotNet项目
dotnet new benchmark --console-app

NativeMemoryProfiler使用

在Nuget管理器中安装BenchmarkDotNet.Diagnostics.Windows包

执行后生成的结果(没有执行完成,是因为电脑在运行的时候突然蓝屏,怀疑是CPU温度过高造成的,因为笔记本好几年没有换过散热硅脂了):

看BenchmarkDotNet文档中代码:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Diagnostics.Windows.Configs;namespace dotnet_perf
{[DisassemblyDiagnoser][NativeMemoryProfiler]   //在BenchmarkDotNet.Diagnostics.Windows.Configs命名空间下[MemoryDiagnoser]public class IntroNativeMemory{[Benchmark]public void BitmapWithLeaks(){var flag = new Bitmap(200, 100);var graphics = Graphics.FromImage(flag);var blackPen = new Pen(Color.Black, 3);graphics.DrawLine(blackPen, 100, 100, 500, 100);}[Benchmark]public void Bitmap(){using (var flag = new Bitmap(200, 100)){using (var graphics = Graphics.FromImage(flag)){using (var blackPen = new Pen(Color.Black, 3)){graphics.DrawLine(blackPen, 100, 100, 500, 100);}}}}private const int Size = 20; // Greater value could cause System.OutOfMemoryException for test with memory leaks.private int ArraySize = Size * Marshal.SizeOf(typeof(int));[Benchmark]public unsafe void AllocHGlobal(){IntPtr unmanagedHandle = Marshal.AllocHGlobal(ArraySize);Span<byte> unmanaged = new Span<byte>(unmanagedHandle.ToPointer(), ArraySize);Marshal.FreeHGlobal(unmanagedHandle);}[Benchmark]public unsafe void AllocHGlobalWithLeaks(){IntPtr unmanagedHandle = Marshal.AllocHGlobal(ArraySize);Span<byte> unmanaged = new Span<byte>(unmanagedHandle.ToPointer(), ArraySize);}}
}

ThreadingDiagnoser

using System.Threading;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers;namespace dotnet_perf
{[ThreadingDiagnoser]  //在BenchmarkDotNet.Diagnosers命名空间下public class IntroThreadingDiagnoser{[Benchmark]public void CompleteOneWorkItem(){ManualResetEvent done = new ManualResetEvent(initialState: false);ThreadPool.QueueUserWorkItem(m => (m as ManualResetEvent).Set(), done);done.WaitOne();}}
}

执行结果(可以看到在.Net 5和.Net Core 3.1性能相差不大,是因为在.Net 5中并没有对ThreadPool进行改进,但对异步是有改进):

MemoryDiagnoser使用

这个在笔记本没法跑出结果.是NativeMemoryProfiler一样,笔记本散热达不到.在测试的时候回突然黑屏.这里直接跳过.

v0.12.1 生成跨平台汇编代码

using System;
using BenchmarkDotNet.Attributes;namespace dotnet_perf
{[DisassemblyDiagnoser(printSource:true)][RyuJitX64Job]public class TestJit{private B[] _array = new B[42];[Benchmark]public int Ctor() => new Span<B>(_array).Length;}class A{}sealed class B : A{}
}
dotnet run -c Release -f net48 --runtimes net48 netcoreapp31 netcoreapp50 --filter ** --join

BenchmarkDotNet 生成汇编代码,和原先不一样,原先是要到ObjDump.exe(是需要安装MingW/Cygwin),现在需要iced(库,纯C#代码实现,另外有Rust实现).说起这个比较坑.BenchmarkDotNet v0.12.1 是依赖的iced 1.4.0版本,使用新版本,是有异常的.iced库目前只支持X86架构(32位和64位),看代码中没有Arm相关的目录,应该是不支持的.

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

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

相关文章

centos amd双显卡_PCIe4.0和PCIe3.0对显卡性能差别大吗?

众所周知&#xff0c;AMD X570、B550主板&#xff0c;包括RX3000系列显卡&#xff0c;率先支持了PCIe 4.0协议&#xff0c;高达32GB/s带宽&#xff0c;相比现在的PCIe3.0带宽足足翻了一倍&#xff0c;也是AMD新平台一大卖点&#xff0c;然而intel却无动于衷&#xff0c;并各种表…

我画着图,FluentAPI 她自己就生成了

在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性&#xff1a;使用状态图来生成任意给定的 FluentAPI 设计。开篇摘要 在非常多优秀的框架中都存在一部分 FluentAPI 的设计。这种 API 设计更加符合人类自言语言描述。使得代码更加具备可读性。在 New…

java爬虫基础知识,Java网络爬虫基础知识

引言Java 网络爬虫具备很好的扩展性可伸缩性&#xff0c;其是目前搜索引擎开发的重要组成部分。例如&#xff0c;著名的网络爬虫工具 Nutch 便是采使用 Java 开发&#xff0c;该工具以 Apache Hadoop 数据结构为依托&#xff0c;提供了良好的批解决支持。Java 网络爬虫涉及到 J…

.NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你

随着2020进入4季度&#xff0c;.NET5正式版也已经与大家见面了。不过&#xff0c;尽管 .NET Core发布已经有四五年的时间&#xff0c;但到目前为止&#xff0c;依旧有很多.NET开发者在坚守者.NET4&#xff0c;原因不尽相同&#xff0c;但最大的问题可能还是不熟悉Linux&#xf…

好用的平板电脑_平板选择华为M6,这里有几点建议

大家好&#xff0c;我是师兄。平板几乎已经成大学生生活中必备的物品之一了&#xff0c;现在的学生实在是太会享受了。作为华为M6的重度使用用户&#xff0c;在这里给大家在购买华为平板M6时提几点建议。1.质量挺好的&#xff0c;品制有保证购买华为平板M6已经半年了&#xff0…

读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle

因为做项目&#xff0c;需要使用BFILE字段存储图像文件&#xff0c;所以进行了一些研究。bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复bfile的基本操作如下&#xff1a;1.先在oracle数据库中下面我…

客户的一个紧急bug,我用了两种方式进行 C# 反编译修改源码

一&#xff1a;背景 1. 讲故事周五下午运营反馈了一个紧急bug&#xff0c;说客户那边一个信息列表打不开&#xff0c;急需解决&#xff0c;附带的日志文件也发过来了&#xff0c;看了下日志大概是这样的&#xff1a;日期:2020-11-13 12:25:45,923 线程ID:[3924] 日志级别:INFO …

离线语音识别软件_从音乐识别软件起家,这家公司如何备战车载AI语音市场GGAI对话...

加入高工智能汽车专业行业群(自动驾驶5群&#xff0c;车联网智能座舱3群&#xff0c;智能网联商用车2群)&#xff0c;加微信&#xff1a;17157613659&#xff0c;出示名片&#xff0c;仅限智能网联汽车软硬件供应商及OEM厂商。早在2016年&#xff0c;亚马逊推出的语音助手Alexa…

int函数在Oracle,vb中int是什么意思 ?

VB语言中int函数的意思是取整数。即&#xff1a;int(x)函数是取不大于x的最大整数。例如&#xff1a;1、int(4.88)4int(4.88)即是取一个不大于4.88且最接近4.88的整数&#xff0c;所以int(4.88)4。2、int(8.1)8int(8.1)即是取一个不大于8.1且最接近8的整数&#xff0c;所以int(…

windows如何添加本机dns记录_运维必看!超清晰的 DNS 原理入门指南

来源&#xff1a;阮一峰的网络日志作者&#xff1a;阮一峰链接&#xff1a;http://www.ruanyifeng.com/blog/2016/06/dns.htmlDNS 是互联网核心协议之一。不管是上网浏览&#xff0c;还是编程开发&#xff0c;都需要了解一点它的知识。本文详细介绍DNS的原理&#xff0c;以及如…

天际数见数据质量巡检架构优化

源宝导读&#xff1a;天际数见平台是一个数据可视化的BI平台&#xff0c;定位于为高层决策提供数据可视化赋能。数据准确性是生命线&#xff0c;如何提前发现数据问题&#xff0c;快速定位和修复问题&#xff0c;成为我们必须攻克的难点。本文将介绍数见平台通过架构优化&#…

db2 删除存储过程_蚂蚁金服OceanBase挑战TPCC | TPCC基准测试之存储优化

蚂蚁金服自研数据库 OceanBase 登顶 TPC-C 引起业内广泛关注&#xff0c;为了更清楚的展示其中的技术细节&#xff0c;我们特意邀请 OceanBase 核心研发人员对本次测试进行技术解读&#xff0c;共包括五篇&#xff1a;1)TPC-C基准测试介绍2)OceanBase如何做TPC-C测试3)TPC-C基准…

Github Actions 中 Service Container 的使用

Github Actions 中 Service Container 的使用Intro之前写过一个 StackExchange.Redis 的一个扩展&#xff0c;测试项目依赖 redis&#xff0c;所以之前测试一直只是在本地跑一下&#xff0c;最近通过 Github Action 中的 Service Container 来通过 CI 来跑测试&#xff0c;分享…

深度探秘.NET 5.0

2020 中国.NET 开发者峰会正式启动 &#xff0c;欢迎大家提交演讲主题或者购买超级早鸟票。今年11月10号 .NET 5.0 如约而至。这是.NET All in one后的第一个版本&#xff0c;虽然不是LTS(Long term support)版本&#xff0c;但是是生产环境可用的。微软从.NET 5 Preview 1就开…

vuex保存用户信息_Vuex状态管理

一个组件可以分为数据和视图&#xff0c;数据更新时&#xff0c;视图也会自动更新。在视图中又可以绑定一些事件&#xff0c;它们触发methods里面指定的方法&#xff0c;从而又可以改变数据、更新视图&#xff0c;这就是一个组件基本的运行模式。但实际的业务中&#xff0c;经常…

使用 docker 构建分布式调用链跟踪框架skywalking

一旦你的程序docker化之后,你会遇到各种问题&#xff0c;比如原来采用的本地记日志的方式就不再方便了&#xff0c;虽然你可以挂载到宿主机&#xff0c;但你使用 --scale 的话&#xff0c;会导致记录日志异常&#xff0c;所以最好的方式还是要做日志中心化&#xff0c;另一个问…

excel同一单元格怎么换行_excel表格内怎么换行 方法有两种 一看就会 新手教程...

很多人在用excel表格的时候都需要用到换行&#xff0c;但是有一些小伙伴还不知道如何去换行。今天就介绍两种单元格内换行的方法&#xff0c;这两种换行方式的效果不一样&#xff0c;大家可以根据自己的需求来选择使用哪种换行方式。方法一&#xff1a;单元格内自动换行操作&am…

持续交付一:从开发到上线的环境

团队开发中&#xff0c;开发&#xff0c;测试&#xff0c;预发布&#xff0c;生产&#xff0c;不同的角色工作在不同的环境中&#xff0c;不同的环境有不同的作用(有些公司的环境更多&#xff0c;按照自己的交付流程设计)&#xff0c;当然不同的环境&#xff0c;配置也不能相同…

win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少

不知不觉&#xff0c;Win10与我们相伴已经整整四个年头了&#xff0c;从最开始的组团抗拒到现在的默默接受&#xff0c;个中滋味相信谁心里都有个数。近日微软开始推送“Win10更新五月版”&#xff0c;那么Win10中到底都有哪些“骚”操作&#xff1f;一起来看看吧。1、夜间模式…

C# 中的数字分隔符 _

编写 C# 代码时&#xff0c;我们时常会用到很大的数字&#xff0c;例如下面定义的变量&#xff1a;const long loops 50000000000;您能快速读出这是多少吗&#xff1f;是不是还是会有很多人把光标定位到最后一位&#xff0c;然后按键盘上的向左键一个一个往上数&#xff1a;个…