Pergunta

O que é a capacidade padrão de um StringBuilder?

E quando deve (ou não) o padrão ser usado?

Foi útil?

Solução

O Venerável J. Skeet tem proporcionado uma boa análise de precisamente este problema:

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

Outras dicas

A capacidade padrão de StringBuilder é de 16 caracteres (eu usei .NET Reflector para descobrir).

O padrão é 16, o que parece ser a capacidade padrão de qualquer tipo de matriz ou lista no framework .NET. O menor número de realocações que você precisa em seu StringBuilder, o que é melhor. Enquanto isso, não é necessário alocar muito mais do que é necessário, também.

Normalmente, eu instanciar o StringBuilder com algum tipo de estimativa aproximada quanto ao tamanho final do StringBuilder. Por exemplo, isso pode ser baseado em alguma contagem de iteração que você vai usar mais tarde para construir a corda, vezes o tamanho necessário para cada item nesta iteração.

// 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++ )
{
...
}

Quando o tamanho de um StringBuilder é muito pequeno para escrever a próxima corda, a matriz de char interno de StringBuilder é realocados para duas vezes o seu tamanho actual.

Esta questão surgiu hoje como uma duplicata de outro, mas eu noto uma parte não foi respondida. O padrão (assumindo que significa "quando não foi criado com uma cadeia que é grande o suficiente para exigir) é 16 como as pessoas diziam, mas eu não vejo aqui qualquer coisa de quando você deve alterá-lo.

Você alterá-lo quando você pode fazê-lo como uma possível otimização. Na verdade, a escolha de 16 é o oposto de uma otimização. Otimização é escolher valores e abordagens, a fim de particularmente bem atender um caso ou subconjunto de possíveis casos particular, (não "fazer as coisas mais rápido" em geral, embora É assim que muitas vezes usam a palavra). Aqui o designer da classe teve de lidar com generalização -. Escolher valores e abordagens de modo a dar razoavelmente bom desempenho em uma ampla gama de casos

O menor que fossem, o uso menos de memória.

Quanto maior eles foram, menos realocação para lidar com cadeias maiores.

Há algumas razões pelas quais (poderes inteiros de dois) binárias rodada são susceptíveis de dar um melhor desempenho do que outros números, em certos casos, por isso eles foram para um desses, mas isso de lado a escolha entre 4 ou 16 ou 1024 era uma questão de equilibrar diferentes valores prováveis.

Alguém usando StringBuilder em vez de projetá-lo, pode ter uma idéia melhor do que o tamanho que são susceptíveis de necessidade.

Se eles estão indo para Append 5 números de 1 dígito, juntamente com cordas que total a 43 caracteres de comprimento, então o comprimento total do StringBuilder vai ser 48 caracteres, não importa o quê, então eles devem usar uma capacidade de 48 como 48 é sempre o tamanho mais eficiente para uma série de 48 comprimento.

Se eles estão fazendo algo onde poderia haver qualquer comprimento entre cerca de 23 e 34 caracteres, eles devem usar 34.

Se eles estão fazendo algo onde há provavelmente nunca será mais do que 60 caracteres, mas de vez em quando poderia haver, eles devem usar 64 (não realocar para a maioria das peças, e ganhar o poder-de-dois benefícios mencionado acima para os poucos casos em que você faz).

Se for impossível chegar a uma conclusão sobre isso, ou pelo menos difícil de fazê-lo e não um desempenho hot-spot, então você deve apenas usar o padrão.

Podemos encontrar a capacidade de usar a propriedade capacidade da Classe StringBuilder:

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

Aqui capacidade define a capacidade padrão de StringBuilder.

StringBuilder é Max Capacity é o mesmo que o valor máximo de Int32.

[edit: no momento, a pergunta sobre StringList]

Você StringCollection média? Este utiliza um ArrayList vazia inicialmente, então a resposta é 0. E você não tem nenhuma opção para mudar isso. Quando você adicionar um item, a capacidade salta para 4, em seguida, utiliza uma estratégia de duplicação quando se enche.

Se você List<string> média, então é semelhante (um T[] vazio, não um ArrayList), mas você pode inicializar um tamanho conhecido, se você precisa (ou seja, você sabe o quanto de dados você espera). Mais uma vez, a primeira vez que Add a um List<T> o tamanho salta a 4, em seguida, dobra a cada vez que enche.

A capacidade padrão de um String-Builder é 16 caracteres , E capacidade máxima de String-Builder é 2147483647 caracteres .

Assim, não há necessidade de preocupação para armazenar resposta a longo !!!

ler ouvir sobre stringbuilder capacidade , há amostra aplicativo para provar isso também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top