翻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

时间: 2024-10-05 13:30:05

翻String.Format源码发现的新东西:StringBuilderCache的相关文章

String部分源码分析

最近想处理上传文件时request包含的混合信息,得到的流可以部分解析成String部分依旧当二进制流处理 于是把BufferedInputStream和String的源码相关部分都读了一下 String是final修饰的类这个大家应该都知道,其中主要的char[] value也是final修饰的 大概看了下字符串驻留结合自己的理解,我试着讲下白话文= =# String a="abc"; 这样是在池内先搜索"abc"如果没有创建一个字符串"abc&quo

There is no getter for property named '*' in 'class java.lang.String'之源码分析

There is no getter for property named '*' in 'class java.lang.String',此错误之所以出现,是因为mybatis在对parameterType="String"的sql语句做了限制,假如你使用<when test="username != null">这样的条件判断时,就会出现该错误,不过今天我们来刨根问底一下. 一.错误再现 想要追本溯源,就需要错误再现,那么假设我们有这样一个sql查询

cocos2d-x 源码分析 : EventDispatcher、EventListener、Event 源码分析 (新触摸机制,新的NotificationCenter机制)

源码版本来自3.x,转载请注明 cocos2d-x 源码分析总目录 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结构 1.1 结构 不详吐槽太多,也不贴图了,贴图要审核好久好久好久好久. 从小到大,先来看下Event的结构. 1.Event--------EventTouch,EventCustom,EventMouse,EventKeyboard,EventFocus,EventAcceleration 其中,Eve

LeetCode-Reverse Words in a String[AC源码]

1 package com.lw.leet1; 2 3 import java.util.Stack; 4 5 /** 6 * @ClassName:Solution 7 * @Description: 8 * Reverse Words in a String 9 * Total Accepted: 26194 Total Submissions: 187094 My Submissions 10 * Given an input string, reverse the string word

Hadoop-2.4.1学习之NameNode -format源码分析

在Hadoop-2.X中,使用hdfs namenode –format对文件系统进行格式化.虽然无论是在生产环境还是测试环境中,已经使用了该命令若干次了,也大体了解该命令就是在本地文件系统中创建几个文件夹,但具体是如何执行的则需要通过阅读源代码来了解了. 要想看到该命令的源代码,需要看看hdfs脚本中是如何执行相应的java类的.在hdfs脚本中,下面的语句说明了实际执行的java类和参数,其中类为org.apache.hadoop.hdfs.server.namenode.NameNode,

java.lang.String 类源码解读

String类定义实现了java.io.Serializable, Comparable<String>, CharSequence 三个接口:并且为final修饰. public final class String defined String由char[]数组实现 /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the strin

源码管理的新15条建议

作者:张克强    作者微博:张克强-敏捷307 建议之1:使用好的配置管理工具,也称为版本号控制工具(Version Control), 比方Git,SVN. 请彻底抛弃 VSS.假设是新採用配置管理工具,CVS已经不再是选项. 配置管理工具与版本号控制工具能够理解为指的是同样工具. 建议之2:抛弃古老的配置管理三库做法,常说的三库是指开发库(动态库).受控库和产品库(静态库).做法是开发库->受控库->产品库. 在当年没有强大版本号控制工具的"古代",三库做法是不得不的

java String部分源码学习记录

public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /**char数组用于字符的存储 */ private final char value[]; /** 缓存string的hash码 */ private int hash; // Default to 0 public String() {/**无参构造函数,打印值为""*/ this.

源于直播又高于直播,一对一直播源码引领时尚新热潮

作者/布谷惠泽 来源/山东布谷鸟网络 随着移动互联网技术的发展日新月异,新的程序产品层出不穷,直播市场也是精彩纷呈,战况十分激烈,由此看来直播平台寻找新的解决方案也是迫在眉睫,在这种市场情况下,各种"直播+"的方案先后推出,音乐,教育,人文等都在垂直领域和直播进行了很好的融合,在诸多解决方案中,一对一直播平台源码顺应市场,走出了一条属于自己的特色鲜明的道路. 综合各大应用市场社交app的下载应用数据来看,一对一直播源码平台上说是风口也不为过."及时+交互"的模式,在