池化对象 RecyclableMemoryStream 在 .netcore 中的使用

Microsoft.IO.RecyclableMemoryStream 是一个被设计为专门用于提高 Stream 操作的高性能类库,意思很明显,专用于取代 MemoryStream 而生,RecyclableMemoryStream 可以最大限度的避免 Stream 操作在 GC 上的 LOH (大对象堆)的分配和内存碎片,泄露等烦人的问题,这篇文章我们将会讨论 Microsoft.IO.RecyclableMemoryStream 及如何在 .NET Core 应用程序中提升性能。

RecyclableMemoryStream 的价值

RecyclableMemoryStream 大体上提供了如下四点价值。

  • 使用缓冲池避免 LOH 分配。

  • 大大的减少生成到2代堆的可能,相对减少了 GC 回收时造成的线程停滞时间。

  • 避免了内存碎片和内存泄漏。

  • 提供了用于跟踪和分析性能的度量值。

RecyclableMemoryStream 的原理

RecyclableMemoryStream 在2代堆上存储了一个用于流的大型缓冲区,并能够确保这个缓冲区在进程的生命周期内一直存在,这就确保了GC不会频繁的出现全量回收,同时 RecyclableMemoryStreamManager 类维护了两类缓冲池。

  • 小型缓冲池  常用于读写操作,每一个小池子大小为 128k。

  • 大型缓冲池   常用于当有连续缓冲的场景下使用,每一个大池子大小为 1MB。

值得注意的是,大型缓冲池的扩容又分为 线性增长指数型增长,可以看出内存可被高效的反复使用并且对调用者还是无感知的,这就是为什么 RecyclableMemoryStream 比 MemoryStream 更好更高效的原因。

当调用 GetBuffer() 方法时,小缓冲区将会转换为一个大的连续缓冲区,如下代码所示:


var buffer = recyclableMemoryStreamManager.GetStream().GetBuffer();

安装 RecyclableMemoryStream

你可以通过 Nuget 可视化界面安装 Microsoft.IO.RecyclableMemoryStream 或者通过 NuGet package manager console window 执行如下命令。


Install-Package Microsoft.IO.RecyclableMemoryStream

使用 RecyclableMemoryStream

安装好之后,接下来我们通过 RecyclableMemoryStream 将数据写入到 MemoryStream 中,值得注意的是,RecyclableMemoryStreamManager.GetStream() 方法返回的是 MemoryStream 实例。

class Program{private static readonly RecyclableMemoryStreamManager recyclableMemoryStreamManager = new RecyclableMemoryStreamManager();static void Main(string[] args){string data = "This is a sample text message.";var buffer = Encoding.ASCII.GetBytes(data);using (var memoryStream = recyclableMemoryStreamManager.GetStream()){memoryStream.Write(buffer, 0, buffer.Length);}Console.ReadKey();}}

上面的代码还有一点要注意,我将 RecyclableMemoryStreamManager 静态化了,意味着它只需要定义一次就ok了,还有一点你可以对 MemoryStream 进行标记,方便后续持续跟踪,如下代码所示:

using (var memoryStream = recyclableMemoryStreamManager.GetStream("High_Performance_Stream_Demo.Program.Main")){memoryStream.Write(buffer, 0, buffer.Length);}

对 MemoryStream Pool 精细化配置

如果你想对 MemoryStream Pool 做更精细化的配置,可以在 RecyclableMemoryStreamManager 实例上进行配置,如下代码所示:


int blockSize = 1024;
int largeBufferMultiple = 1024 * 1024;
int maximumBufferSize = 16 * largeBufferMultiple;
int maximumFreeLargePoolBytes = maximumBufferSize * 4;
int maximumFreeSmallPoolBytes = 250 * blockSize;
var recyclableMemoryStreamManager = new RecyclableMemoryStreamManager(blockSize, largeBufferMultiple, maximumBufferSize);
recyclableMemoryStreamManager.AggressiveBufferReturn = true;
recyclableMemoryStreamManager.GenerateCallStacks = true;
recyclableMemoryStreamManager.MaximumFreeLargePoolBytes = maximumFreeLargePoolBytes;
recyclableMemoryStreamManager.MaximumFreeSmallPoolBytes = maximumFreeSmallPoolBytes;

RecyclableMemoryStream 最佳实践

内存碎片会影响到程序的性能,而且LOH独有的链式管理也非常容易产生内存碎片,下面是使用 RecyclableMemoryStream 应该遵循的一些经验法则。

  • 根据你的业务场景设置合适的 blockSize, largeBufferMultiple, maxBufferSize, MaximumFreeLargePoolBytes, MaximumFreeSmallPoolBytes 值。

  • 当使用完 Stream 对象时一定要速速关闭。

  • 永远不要调用 ToArray() 方法。

  • 尽可能避免调用 GetBuffer() 方法。

Microsoft.IO.RecyclableMemoryStream 是 MemoryStream 的池化对象,它技巧性的减少了 GC 的负载并减少了 LOH 的大对象分配,自然就提高了应用程序的性能,不仅避免了内存碎片和内存泄漏还提供了用于跟踪性能的指标。

译文链接:https://www.infoworld.com/article/3597060/how-to-use-recyclablememorystream-in-net-core.html

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

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

相关文章

ASP.NET中过滤HTML字符串的两个方法

先记下来&#xff0c;以作备用&#xff01;///<summary>去除HTML标记 //////</summary>///<param name"Htmlstring">包括HTML的源码</param>///<returns>已经去除后的文字</returns>publicstaticstringGetNoHTMLString(s…

新增一个主键自增长_MyBatis 示例-主键回填

测试类&#xff1a;com.yjw.demo.PrimaryKeyTest自增长列数据库表的主键为自增长列&#xff0c;在写业务代码的时候&#xff0c;经常需要在表中新增一条数据后&#xff0c;能获得这条数据的主键 ID&#xff0c;MyBatis 提供了实现的方法。StudentMapper.xml<insert id"…

干货|机器学习零基础?不要怕,吴恩达课程笔记第三周!逻辑回归与正则

吴恩达Coursera机器学习课系列笔记课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础干货|机器学习零基础&#xff1f;不要怕&#xff0c;吴恩达机器学习课程笔记2-多元线性回归1Logistic Regression1.1 Logistic Regression (Classification) Model之前对房价的预测&a…

计算机网络互联网技术实验报告,2013计算机网络技术与应用.实验报告01

本报告 6 月 5 日前完成。 此框阅读后删除。 此处填写&#xff1a;年级和姓名。 《计算机网络技术与应用》实验报告 此框阅读后删除。 年级、专业、班级 实验题目 实验时间 实验成绩 2013.4.1 11 级 专业 班 姓名计算机网络应用软件与拓扑结构实验地点 实验性质 DS1422■验证性…

如何在C#中使用 ArrayPool,MemoryPool

对资源的可复用是提升应用程序性能的一个非常重要的手段&#xff0c;比如本篇要分享的 ArrayPool 和 MemoryPool&#xff0c;它们就有效的减少了内存使用和对GC的压力&#xff0c;从而提升应用程序性能。什么是 ArrayPool System.Buffers 命名空间下提供了一个可对 array 进行复…

LAMP攻略: LAMP环境搭建,Linux下Apache,MySQL,PHP安装与配置

之前写过一个red hat 9下的LAMP环境的配置&#xff0c;不过由于版本比较旧&#xff0c;很多不适用了。 所以决定写一个新的LAMP环境搭建与配置教程。本配置是在 CentOS-5.3 下 httpd-2.2.11.tar.gz MySQL-client-community-5.1.33-0.rhel5.i386.rpm MySQL-devel-community-5.1…

canvas 实现图片局部模糊_Canvas模糊化处理图片、毛玻璃处理图片之stackblur.js

Canvas实现毛玻璃效果解决方式1&#xff1a;使用stackblur.js在Android系统中实现图片的毛玻璃效果比较好用的类库是&#xff1a;Android StackBlur简单API说明&#xff1a;API 调用下面是针对不同的源(图片或者 Canvas 等)进行 StackBlur 的调用。图像作为源:StackBlur.image(…

服务器自动删文件,服务器定时删除文件工具

服务器定时删除文件工具&#xff0c;这是一个定时删除服务器上文件的小程序修改配置文件config.ini&#xff0c;dir是主目录;dirs是要删除文件目录;deltype是删除类型,0是创建日期,1是修改日期;delday是保留天数;deltime是定时删除时间。[config]dir\\cb19\pictifdirs01,02,03,…

30 个实例详解 TOP 命令

Linux中的top命令显示系统上正在运行的进程。它是系统管理员最重要的工具之一。被广泛用于监视服务器的负载。在本篇中&#xff0c;我们会探索top命令的细节。top命令是一个交互命令。在运行top的时候还可以运行很多命令。我们也会探索这些命令。&#xff08;译注&#xff1a;不…

IComparer与IEqualityComparer的简单使用

场景一&#xff1a;对象列表的自定义排序简单类型的列表&#xff0c;可以直接使用Linq的OrderBy或OrderByDescending进行排序&#xff0c;复杂对象的列表排序可以使用Sort()和IComparer实现自定义对象比较规则。假如有一个Box类&#xff0c;它有名称、长、宽、高四个属性&#…

Linux 远程开机(walk on lan)

Linux 远程开机&#xff08;walk on lan&#xff09;一&#xff0c;什么情况下需要远程开机&#xff1f; 如果我们的服务器没有部署在本地&#xff08;实际上通常都是这样的&#xff0c;我们会把服务器托管到IDC机房&#xff09;&#xff0c; 而且服务器在机房中不止一台&am…

程序显示文本框_【教程】TestComplete测试桌面应用程序教程(二)

TestComplete是一款具有人工智能的自动UI测试工具&#xff0c;利用自动化测试工具和人工智能支持的混合对象识别引擎&#xff0c;轻松检测和测试每个桌面&#xff0c;Web和移动应用程序。其中&#xff0c;TestComplete支持测试使用C、C&#xff03;、VB.NET、Java、Delphi、C …

陕西省计算机二级报名流程,计算机二级考试报名流程

计算机二级考试报名流程第一次参加全国计算机等级考试的考生对于网上报名的流程&#xff0c;对全国计算机考试流程中某些环节并不清楚。下面是小编为大家带来的计算机二级考试报名流程&#xff0c;欢迎阅读。(一)注册账号和登录1)考生首次登录系统需要注册登录通行证&#xff0…

Git 的 4 个阶段的撤销更改

虽然git诞生距今已有12年之久&#xff0c;网上各种关于git的介绍文章数不胜数&#xff0c;但是依然有很多人&#xff08;包括我自己在内&#xff09;对于它的功能不能完全掌握。以下的介绍只是基于我个人对于git的理解&#xff0c;并且可能生编硬造了一些不完全符合git说法的词…

51CTO下载专题有奖征集建议:您的期待,我们的方向!

2010年5月10日&#xff0c;51CTO下载专题 隆重上线。精细的技术领域、优质的技术资源、大方的设计风格......让您对精品资源一网打尽&#xff0c;直达心灵所需&#xff01; 51CTO下载专题每周发布1-2期&#xff0c;旨在帮助大家在最短的时间里&#xff0c;找到自己感兴趣技术点…

Visual Studio SnippetDesigner使用

SnippetDesigner代码片段编辑器这是一款在Visual Studio上代码片段编辑器插件&#xff0c;可以轻松创建代码片段&#xff0c;为什么要用这个代码片段呢&#xff0c;理由&#xff1a;平常在编码过程中&#xff0c;有许多重复性的代码语句&#xff0c;为了提高编码速度与便捷&…

python中merge函数怎么用_Python Merge函数原理及用法解析

Merge函数的用法简单来说Merge函数相当于Excel中的vlookup函数。当我们对2个表进行数据合并的时候需要通过指定两个表中相同的列作为key&#xff0c;然后通过key匹配到其中要合并在一起的values值。然后对于merge函数在Pandas中分为1vs1, 多(m)vs1&#xff0c;以及多(m)vs多(m)…

计算机显卡是指什么时候,电脑哪个是显卡

语音内容&#xff1a;大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以台式机电脑为例&#xff0c;一般有两种显卡&#xff0c;找到显卡位置的方法&#xff1a;1、集成显卡。集成显卡被集成在CPU或者主板芯片组内部&#xff0c;不…

人民币大写格式转换

在处理财务报表时&#xff0c;单元格格式设置为人民币大写后&#xff0c;-123显示为红色的“壹佰贰拾叁元整”&#xff0c;打印出来后无法区别是正数还是负数&#xff1b;同时有的单位习惯在大写数字前加上“人民币大写&#xff1a;”字样。为了满足不同的人民币大写格式的需要…

生态合作与自主可控

生态合作与自主可控是一个大题目&#xff0c;从不同角度来讨论&#xff0c;不同的人会得出不同的结论。为了交流不空洞&#xff0c;先介绍一个案例&#xff0c;它具有普遍性&#xff1a;L总应该是前年与我们联系过&#xff0c;今年刚刚与我们联系描述了一下他们的现状&#xff…