起因

在看.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相关的目录,应该是不支持的.

BenchmarkDotNet v0.12x新增功能相关推荐

  1. 服务器创建和附加虚拟磁盘,Windows 7 虚拟硬盘中的新增功能

    [IT168 专稿]Microsoft 虚拟硬盘文件格式 (.vhd) 是一种公用格式规范,用于指定封装在单个文件中的虚拟硬盘,它能够承载本机文件系统并支持标准的磁盘操作. Microsoft Win ...

  2. Microsoft Dynamics AX 2009 新增功能 – 应用(目录)

    PDF 下载链接 第 1 章:新增常规功能 用户界面更新 角色中心 工作流 Contoso 演示数据集 第 2 章:财务 填充实用程序 过帐限制 原因代码 自动分摊 – 总帐 冲销分录 – 总帐 预算 ...

  3. android studio 前言中不允许有内容_Android Studio 中 System Trace 的新增功能

    在 Android Studio 4.0 中,我们已经对 CPU Profiler 的 UI 做了大量调整来提供更加直观的工作流记录,而在 Android Studio 4.1 中,我们基于开发者们的 ...

  4. Nmap 7.70新增功能——扫描主机所有IP

     Nmap 7.70新增功能--扫描主机所有IP 有时,一个主机可能存在多个IP地址,如网站服务器.用户可以使用nmap提供的--resolve-all选项进行扫描.其语法格式如下: nmap --r ...

  5. Hydra 8.4/8.5新增功能

    Hydra 8.4/8.5新增功能 Kali Linux 2017.1自带的Hydra为8.3,现在Hydra升级到8.5,新增以下功能. (1)为输出文件选项-o,添加一个配套选项-b,允许将验证的 ...

  6. C# 9.0中的新增功能 - 译

    https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9 What's new in C# 9.0 C# 9.0中的新增功能 ...

  7. 华为5ipro详细参数使用功能_详细讲解双计双控智能电表技术参数以及新增功能优势...

    双计双控智能电表(升级版)是一款具有两路计量两路控制智能费控功能的电表,相当于两台智能电表组合成一台智能电表.它采用微电子技术研制的新型电度表,该表具有高精度计量.智能费控.自动结算电费.恶性负载识别 ...

  8. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能...

    原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40 ...

  9. ABP Framework 5.2 RC 版本发布及新增功能介绍

    本文将介绍 ABP Framework 5.2 RC 版新增的主要功能: •单层解决方案模板•API 版本控制•源代码控制移除libs文件夹•对 Swagger UI 隐藏 ABP 默认端点•CMS ...

最新文章

  1. u-boot移植问题记录(一)--U_BOOT_CMD区别
  2. Android项目中的assets和raw文件夹
  3. Vue.js组件学习
  4. 人工智能 | 自然语言处理(NLP)(国内外研究组)
  5. raid读写速度对比_U盘读写速度哪家强?4款全金属USB3.0的U盘读写速度对比
  6. 【Linux】一步一步学Linux——tracepath命令(168)
  7. 关于idea的git账号与电脑的git账号不一致的问题。已解决!
  8. python通过内置模块监控磁盘、内存、CPU、负载
  9. 对《技术人员,你拿什么拯救你的生活----温水煮青蛙》的一点看法
  10. 【android】AIDL传递自定义类型参数
  11. word插入目录右边对不齐
  12. Boblog热门日志、随机日志、热门Tags插件源代码
  13. VB 2008下载地址
  14. 《人类简史:从动物到上帝》读书摘记
  15. 崇明东平森林公园一日游
  16. linux怎样安装麒麟双系统,手把手教您win10系统装麒麟系统双系统的解决办法
  17. 如何高效搜索公众号文章(r11笔记第35天)
  18. OpenCV3之——霍夫变换(霍夫线变换和霍夫圆变换)
  19. 正面管教读书笔记 08 班会
  20. 如何使用万能的钢笔抠图

热门文章

  1. C#将unix时间戳转换成.net的DateTime类型的代码
  2. android数据持久化存储(2)
  3. C# 内存法图像处理
  4. std::vectorChannel2* m_allChannels;容器,以及如何根据channelid的意义
  5. IE6下margin-left双倍bug问题
  6. DataForm 中通过外面的按钮进行提交时,出错
  7. powerpoint预览_如何放大和缩小PowerPoint演示文稿的一部分
  8. PIE SDK与OpenCV结合说明文档
  9. vue-cli 3.0配置webpack目录别名alias
  10. [JMX一步步来] 7、用JDK5.0的JConsole来连接MBean