翻String.Format源碼發現的新東西:StringBuilderCache


起因:

記不清楚今天是為毛點想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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM