2014-09-24 47 views
1

在.net 4.5中,CLR小組有很多改變StringBuilder類。 HereStringBuilder類的代碼參考。在這裏我們可以找到MaxChunkSize等於8000和上述這個區域註釋:.net 4.5中的StringBuilder是否具有大於MaxChunkSize的塊大小

// We want to keep chunk arrays out of large object heap (< 85K bytes ~ 40K chars) to be sure. 
// Making the maximum chunk size big means less allocation code called, but also more waste 
// in unused characters and slower inserts/replaces (since you do need to slide characters over 
// within a buffer). 

所以我仍然不知道,如果我們將與StringBuilder工作追加大的字符串,例如:

var sb = new StringBuilder(); 
sb.Append(<<Here comes the string with length larger than 80 000 symbols>>); 

我們還會在LargeObjectHeap中分配ChunksArrays嗎?

回答

-1

我的直覺表示你仍然會被LOH標記爲大字符串本身;如果你的字符串大於限制,它仍然會生活在LOH中,儘管StringBuilder不會。

讓我們測試出:

void Main() 
{ 
    var big_ass_string = new String('a', 80001); 
    var sb = new StringBuilder(); 
    sb.Append(big_ass_string); 
    var generation_of_builder = GC.GetGeneration(sb); 
    var generation_of_string = GC.GetGeneration(big_ass_string); 
    Console.WriteLine("StringBuilder is in gen:{0}", generation_of_builder); 
    Console.WriteLine("String is in gen:{0}", generation_of_string); 
} 

輸出:

StringBuilder is in gen:0 
String is in gen:2 
-1

答案是肯定的(即使是在.NET 4.5或更高版本):每次調用sb.Append(...some string larger than 40K chars...);時間的StringBuilder將分配在大型對象堆。 (因此,擊敗了StringBuilder的「新」設計的目的。)我在此發佈了更詳細的信息和可能的修復方法: https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder

相關問題