NLog源码解读——StringBuilderPool

刚刚骚情的跑了下NLog测试,,,,,一篇文章就那么Crash了~~~
好吧,这次简化下,直接进入正题,有关GC的东东参考网上大部分文章吧。

源码分析

// StringBuilder 的建立也会耗费大量的资源,因此共用他们,使用这个类来管理池子
//需要了从这里获取一个,用完自动释放 ItemHolder 即可释放会池子
// 例如  using (var itemHolder = pool.Acquire()){}
internal class StringBuilderPool{private StringBuilder _fastPool;private readonly StringBuilder[] _slowPool;private readonly int _maxBuilderCapacity;/// <summary>/// Constructor/// </summary>/// <param name="poolCapacity">Max number of items</param>/// <param name="initialBuilderCapacity">Initial StringBuilder Size</param>/// <param name="maxBuilderCapacity">Max StringBuilder Size</param>public StringBuilderPool(int poolCapacity, int initialBuilderCapacity = 1024, int maxBuilderCapacity = 512 * 1024){//一个快速池子,一直保持_fastPool = new StringBuilder(10 * initialBuilderCapacity);// 一个慢速池子,如果快速池子被占用,则从慢速池子取一个_slowPool = new StringBuilder[poolCapacity];for (int i = 0; i < _slowPool.Length; ++i){_slowPool[i] = new StringBuilder(initialBuilderCapacity);}_maxBuilderCapacity = maxBuilderCapacity;}/// <summary>/// Takes StringBuilder from pool/// </summary>/// <returns>Allow return to pool</returns>public ItemHolder Acquire(){//1.come on baby,先尝试分配快速池子StringBuilder item = _fastPool;//2.如果你幸运的拿到快速池子,则尽快把快速池子置空,不要让别人抢到了,否则,你就必须进慢速池子取了if (item == null || item != Interlocked.CompareExchange(ref _fastPool, null, item)){//3.你好,兄弟,你已经进入慢车道,来,一个个给你试试能用不for (int i = 0; i < _slowPool.Length; i++){item = _slowPool[i];if (item != null && item == Interlocked.CompareExchange(ref _slowPool[i], null, item)){//4.啊哈,发现一个慢速的,来,给你,别嫌弃return new ItemHolder(item, this, i);}}//这么倒霉,一个都没有,算了,再给你分配一个新的吧,记住,你的编号~~~咦, 第0个吧~~~return new ItemHolder(new StringBuilder(), null, 0);}else{//你是幸运之星,快速跑~~~~return new ItemHolder(item, this, -1);}}/// <summary>/// Releases StringBuilder back to pool at its right place/// </summary>private void Release(StringBuilder stringBuilder, int poolIndex){//来,兄弟,好借好还,再借不难//什么,这么大,我记得借你时没这么大啊,让我再检查检查if (stringBuilder.Length > _maxBuilderCapacity){//我靠,你是快车道的,那就给你10倍大小如何,这都超了,那对不起,减半了~~// Avoid high memory usage by not keeping huge StringBuilders alive (Except one StringBuilder)int maxBuilderCapacity = poolIndex == -1 ? _maxBuilderCapacity * 10 : _maxBuilderCapacity;if (stringBuilder.Length > maxBuilderCapacity){stringBuilder = new StringBuilder(maxBuilderCapacity / 2);}}stringBuilder.Length = 0;//好,各就各位...if (poolIndex == -1){_fastPool = stringBuilder;}else{_slowPool[poolIndex] = stringBuilder;}}//下面是个池化对象类/// <summary>/// Keeps track of acquired pool item/// </summary>public struct ItemHolder : IDisposable{public readonly StringBuilder Item;readonly StringBuilderPool _owner;readonly int _poolIndex;public ItemHolder(StringBuilder stringBuilder, StringBuilderPool owner, int poolIndex){Item = stringBuilder;_owner = owner;_poolIndex = poolIndex;}/// <summary>/// Releases pool item back into pool/// </summary>public void Dispose(){if (_owner != null){_owner.Release(Item, _poolIndex);}}}}

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

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

相关文章

oracle 11g(二)安装过程

(一)解压oracle 11g压缩包注&#xff1a;分别下载oracle 11g的1of2、2of2这两个zip压缩包&#xff0c;将其拷贝到/usr/src目录中解压。[rootserver src]#unzip linux.x64_11gR2_database_1of2.zip[rootserver src]#unzip linux.x64_11gR2_database_2of2.zip(二)安装oracle 11g以…

一定要多角度看事物 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅一定要多角度看事物岁月对我们做了什么无法反驳论发型的重要性坐骨神经痛被赋予了新含义老师真的很会总结了&#xff08;图源E_Volution_&#xff09;扎心了↓ ↓ ↓

从别的地方转来的 网址

网上24个免费图书网站[转贴] 中国数字图书馆 http://www.d-library.com.cn/ ; 权威的在线图书馆。 瑞德超星在线图书馆 http://www.rol.cn.net/library ; 规模大&#xff0c;藏书丰富&#xff0c;包括社会科学、人文科学、自然科学等领域的著作和历史文献等。 可是…下载图书要…

烧录imx6需要的linux空间,IMX6Q学习笔记——开发板的Linux系统更新和烧录

IMX6Q学习笔记——开发板的Linux系统更新和烧录记录自己在电鱼电子开发SAIL-IMX6Q全能板后&#xff0c;并且对系统和模块进行简单测试的过程之后对开发板的Linux系统进行更新和烧录的记录过程&#xff0c;算是进行一个分享和记录&#xff0c;同时也方便自己日后查阅。首先准备好…

ABP Framework:移除 EF Core Migrations 项目,统一数据上下文

原文&#xff1a;Unifying DbContexts for EF Core / Removing the EF Core Migrations Project[1]导读&#xff1a;软件开发的一切都需要平衡在 ABP Framework V4.4 RC 新增功能介绍 中&#xff0c;对应用程序启动解决方案模板做了一个重要改变&#xff1a;删除 EntityFramewo…

Hello Python

2019独角兽企业重金招聘Python工程师标准>>> My first Python demo>>> movies["a","b","c"] >>> print(movies[0]) a >>> print(movies[1]) b >>> >>> print(movies) [a, b, c…

牛顿儿时成绩很差,5岁开始接触物理,也许是他如此伟大的唯一原因!

全世界只有3.14 % 的人关注了青少年数学之旅我们都知道&#xff0c;牛顿是伟大的物理学家&#xff0c;但是也许很多人不知道&#xff0c;牛顿也是平常的孩子&#xff0c;他不是神童&#xff0c;成绩很一般。那牛顿是如何成为如此伟大的物理学家的呢&#xff1f;原来&#xff0c…

世界杯,世界共同的游戏!

还有几天了&#xff0c;学校也准备通宵供电&#xff01;冰镇啤酒酒鬼花生世界杯今夜无人入睡世界杯程序员可乐&#xff1f;忙了4年了&#xff0c;给自己放一个小假吧亚瑟王说&#xff1a;饥饿是敌人&#xff0c;疲劳是敌人Set U Free! 转载于:https://www.cnblogs.com/zc1984/a…

linux删除grid数据文件,MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除...

GridFS是一种在MongoDB中存储大二进制文件的机制&#xff0c;使用GridFS的原因有以下几种&#xff1a;存储巨大的文件&#xff0c;比如视频、高清图片等。利用GridFS可以简化需求。GridFS会直接利用已经建立的复制或分片机制&#xff0c;故障恢复和扩展都很容易GridFS可以避免用…

关于c#:Filter Serilog日志取决于上下文源到不同的接收器?

我有一个.NET Core 2.0应用程序&#xff0c;可以在其中成功使用Serilog进行日志记录。现在&#xff0c;我想将一些数据库性能统计信息记录到一个单独的接收器中(它们不是用于调试的&#xff0c;这基本上是应用程序中所有其他记录的目的&#xff0c;因此我想将它们分开)&#xf…

C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

本节主要说了递归的设计和算法实现&#xff0c;以及递归的基本例程斐波拉契数列、strlen的递归解法、汉诺塔和全排列递归算法。 一、递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维&#xff0c;是一种分而治之的思想。 这个是常见的一种数学算法&#xff0c;其实它…

【物理动图】物理老师一针见血:50张动图看懂高中物理

全世界只有3.14 % 的人关注了青少年数学之旅相互作用作用力与反作用力的特点是什么&#xff1f;摩擦力的大小跟什么有关系&#xff1f;图中两个弹簧的弹力大小是否一样&#xff1f;若一样&#xff0c;为什么&#xff1f;自行车前后轮所受力的方向是什么&#xff1f;物块所受支持…

变动翻屏展示图片效果

<HTML><HEAD><TITLE>变动展示图片效果</TITLE><META http-equivContent-Type content"text/html; charsetgb2312" /><STYLE typetext/css>A:link { COLOR: #00007f; TEXT-DECORATION: none}A:visited { COLOR: #00007f; T…

linux expr格式,计算2-expr命令举例

# **一、expr命令**## **1.语法和功能**只能用于整数运算和字符串长度、匹配等运算处理expr 2 2expr 2 - 2expr 2 \* 2expr 2 / 2i5;iexpr $1 6;echo $i> 说明&#xff1a;运算符及用于计算的数字左右都至少有一个空格&#xff0c;否则会报错乘号需要转义在shell中进行变量…

打造史上最小尺寸.Net Core单文件应用程序

.Net Core支持将应用程序发布成单文件进行部署和分发。以下示例将Windows应用作为独立的单文件应用程序发布&#xff1a;dotnet publish -r win-x64 -c Release /p:PublishSingleFiletrue /p:PublishTrimmedtrue /p:IncludeNativeLibrariesForSelfExtracttrue查看publish目录&a…

别说了,叫爸爸吧! | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;视频源网络&#xff0c;侵权删&#xff09;女主最后的微笑意味深长啊↓ ↓ ↓

嵌入式-C语言面试题【转】

1. 用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09; #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情&#xff1a; 1). #define 语法的基本知识&#xff08;例如&#xff1a;不能以分号结束&a…

华硕路由器 linux上不了网,华硕ASUS路由器连不上网怎么办?

在本文中将给大家详细的介绍&#xff0c;华硕(ASUS)路由器连不上网/无法上网的解决办法&#xff0c;请按照下面的步骤进行操作。1. 首先&#xff0c;检查你的宽带是否可以正常使用&#xff0c;可以通过下面的方法进行测试。(1)观察光猫上的指示灯&#xff0c;如果光信号或者LOS…

NHibernate学习笔记(二):one-to-one关系映射

上一篇&#xff1a;NHibernate学习笔记&#xff08;一&#xff09;&#xff1a;初识NHibernate本文的内容&#xff1a;&#xff11;&#xff0e;介绍NH如何处理对象间one-to-ont的映射关系&#xff1b;经验教训&#xff1a;&#xff11;&#xff0e;操作一对一关联关系中的一个…

【汇总】多种方法教你绕过 TPM 2.0 安装 Windows 11 操作系统

此前我们曾介绍三种方法绕过 TPM 2.0 来安装 Windows 11 操作系统。方法一&#xff1a;删除 appraiserres.dll 文件方法二&#xff1a;替换 appraiserres.dll 文件方法三&#xff1a;替换 install.wim 文件今儿我们再谈谈“大法好”的注册表&#xff0c;希望能帮助大家成功安装…