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

起因:

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

技术分享

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

研究StringBuilderCache类

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

技术分享

首先看到的是这是一个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的控制台程序:

技术分享

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

技术分享

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

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。