翻String.Format源码发现的新东西:StringBuilderCache_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 翻String.Format源码发现的新东西:StringBuilderCache

翻String.Format源码发现的新东西:StringBuilderCache

 2015/2/9 2:51:03  12饕餮21  程序员俱乐部  我要评论(0)
  • 摘要:起因:记不清楚今天是为毛点想F12看String.Format的实现源码了,反正就看到了下图的鸟东西:瞬间石化有没有,StringBuilder还能这么获取?研究StringBuilderCache类下面的事件也简单,果断在StringBuilderCache上面点了F12看源码(Resharpe真是好东西啊。。。)首先看到的是这是一个internal的类,怪不得没见有人这么写过呢!研究一番之后,终于弄清楚这货是干嘛的了:这个类的作用就是缓存一个StringBuilder对象
  • 标签:for 源码 发现

起因:

记不清楚今天是为毛点想F12看String.Format的实现源码了,反正就看到了下图的鸟东西:

image

瞬间石化有没有,StringBuilder还能这么获取?

研究StringBuilderCache类

下面的事件也简单,果断在StringBuilderCache上面点了F12看源码(Resharpe真是好东西啊。。。)

image

首先看到的是这是一个internal的类,怪不得没见有人这么写过呢!

研究一番之后,终于弄清楚这货是干嘛的了:这个类的作用就是缓存一个StringBuilder对象,给那些并不是要做很多Append操作的地方使用的,我们也看到private const int MAX_BUILDER_SIZE = 360,它内部用来判断是用缓存的StringBuilder函数新new出来一个的界限阀值是360.

这个类的流程是这样:

1、调用Acquire方法获取一个StringBuilder,capacity大于360直接new,否则就用StringBuilderCache.CachedInstance这个ThreadStatic变量,当然之后要清空CachedInstance这个变量以防止线程内连续调用Acquire方法获得同一个StringBuilder引用。

2、GetStringAndRelease返回最后的string对象,然后缓存StringBuilder到CachedInstance变量上去。

测试性能

写了简单的验证StringBuilderCache的控制台程序:

image

最终的结果,可以明显看到大量调用的优势:

image

本文源码地址:https://github.com/a407121393/MyDotNetTestProj/tree/master/MyTestSln/TestStringBuilderCache

用到的Util类在另一个目录里面:https://github.com/a407121393/MyDotNetTestProj/tree/master/MyTestSln/Util

发表评论
用户名: 匿名