문제

a의 기본 용량은 무엇입니까? StringBuilder?

그리고 기본값을 언제 사용해야합니까?

도움이 되었습니까?

해결책

유서 깊은 J. Skeet은 정확하게이 문제에 대한 좋은 분석을 제공했습니다.

https://jonskeet.uk/csharp/stringbuilder.html

다른 팁

StringBuilder의 기본 용량은 16 자입니다 (알아 내기 위해 .NET 리플렉터를 사용했습니다).

기본값은 16이며 .NET 프레임 워크에서 모든 유형의 배열 또는 목록의 기본 용량 인 것 같습니다. StringBuilder에 필요한 재 할당 수가 적을수록 더 좋습니다. 한편, 필요한 것보다 훨씬 더 많은 것을 할당하는 것은 불필요합니다.

나는 일반적으로 StringBuilder의 최종 크기에 대해 어떤 유형의 거친 추정치로 StringBuilder를 인스턴스화합니다. 예를 들어, 이것은 나중에이 반복의 각 항목에 필요한 크기의 크기를 구축하기 위해 나중에 사용할 일부 반복 수를 기준으로 할 수 있습니다.

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

StringBuilder의 크기가 다음 문자열을 작성하기에는 너무 작을 때 StringBuilder의 내부 숯 배열은 현재 크기의 두 배로 재 할당됩니다.

이 질문은 오늘 다른 사람의 복제본으로 나왔지만 한 부분은 대답하지 않았다는 것을 알았습니다. 사람들이 말했듯이 기본값 ( "필요한 문자열로 생성되지 않은 경우)은 16이지만 변경해야 할 때는 여기에 아무것도 보이지 않습니다.

가능한 최적화로 그렇게 할 수있을 때 변경합니다. 실제로, 16의 선택은 최적화와 반대입니다. 최적화 가능한 경우의 특정 사례 또는 하위 집합에 특히 적합하기 위해 값과 접근 방식을 선택하고 있습니다 (일반적으로 "더 빨리 만드는 것"은 아니지만, 우리가 종종 단어를 사용하는 방식이지만). 여기서 수업의 디자이너는 일반화 - 광범위한 사례에 걸쳐 합리적으로 우수한 성능을 제공하기 위해 가치와 접근 방식을 선택합니다.

그들이 더 작을수록 기억의 사용이 줄어 듭니다.

더 커질수록 더 큰 줄을 다루기위한 영역이 적습니다.

바이너리 라운드 (2의 전체 힘)가 특정 경우 다른 숫자보다 더 나은 성능을 제공 할 가능성이있는 몇 가지 이유가 있습니다. 따라서 그 중 하나를 위해 갔지만 4 또는 16 또는 1024 사이의 선택은 문제였습니다. 다른 값의 균형을 유지합니다.

누구 사용 StringBuilder 디자인하기보다는 어떤 크기가 필요한지에 대한 더 나은 아이디어를 가질 수 있습니다.

그들이 갈 경우 Append 총 43 자의 문자열과 함께 5 자리 숫자는 길이가 43 자, 그 다음의 총 길이 StringBuilder 48 문자가 될 것이므로 48은 항상 48 길이의 가장 효율적인 크기이므로 48의 용량을 사용해야합니다.

그들이 약 23 ~ 34 개의 숯 사이의 길이가있을 수있는 일을하고 있다면 34를 사용해야합니다.

그들이 60 숯이 넘지 않을 수도있는 일을하고 있다면, 지금은 매번있을 수 있다면, 그들은 64를 사용해야합니다 (대부분의 부품에 대해 재 할당하지 말고 위에서 언급 한 두 가지 전력을 얻으십시오. 당신이하는 몇 가지 사례).

이것에 대한 결론에 도달하는 것이 불가능하거나 최소한 성능 핫스팟이 아닌 그렇게하기가 어렵다면, 기본값 만 사용해야합니다.

우리는 용량 속성을 사용하여 용량을 찾을 수 있습니다. StringBuilder 수업:

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

여기서 용량은 기본 용량을 정의합니다 StringBuilder.

StringBuilder ~이다 Max Capacity 최대 값과 동일합니다 Int32.

편집 : 당시에는 질문이 있습니다. StringList]

당신은 의미합니까? StringCollection? 이것은 빈 것을 사용합니다 ArrayList 처음에는 대답이 0입니다. 그리고 변경할 옵션이 없습니다. 처음 아이템을 추가하면 용량이 4로 점프 한 다음 채우면 배가 전략을 사용합니다.

당신이 의미한다면 List<string>, 그런 다음 비슷합니다 (비어 있습니다 T[], ArrayList), 그러나 필요한 경우 알려진 크기를 초기화 할 수 있습니다 (예 : 예상 데이터의 양을 알고 있습니다). 다시, 처음으로 Add a List<T> 크기는 4로 점프 한 다음 채워질 때마다 두 배가됩니다.

문자열 빌더의 기본 용량입니다 16 자 스트링 빌더의 최대 용량입니다 2147483647 문자.

따라서 긴 응답을 저장하는 것에 대해 걱정할 필요가 없습니다 !!!

읽으십시오 StringBuilder 용량 , 그것을 증명하기위한 샘플 앱이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top