2014-09-24 3 views
1

.net 4.5 CLR 팀은 StringBuilder 클래스가 많이 변경되었습니다. HereStringBuilder 클래스의 코드 참조입니다. 여기에서 우리는 8000에 동일한 MaxChunkSize을 찾아이 필드 위의 댓글을 달 수 있습니다 : 우리는 큰 문자열을 추가 StringBuilder 작업 할 경우.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). 

그래서 난 아직도 예를 들어, 궁금 :

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

우리는 여전히 LargeObjectHeap에 할당 된 ChunksArrays가 있습니까?

답변

-1

본능적으로 본인은 큰 문자열 자체에 대해 LOH에 의해 태그가 지정됩니다. 문자열이 제한보다 크면 StringBuilder은 아니지만 LOH에 계속 살게됩니다.

의가을 테스트하자

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 이상) YES입니다 : 당신이 sb.Append(...some string larger than 40K chars...);를 호출 할 때마다 모두 StringBuilder는 대형 오브젝트에 할당합니다 더미. (따라서 StringBuilder의 "새로운"디자인의 목적을 무너 뜨 렸습니다.) 여기에 대한 자세한 정보와 가능한 수정 내용을 게시했습니다. https://github.com/amikunov/Large-Object-Heap-Fix-For-.NET-String-Builder