Capacidade do StringBuilder


A classe StringBuilder é largamente utilizada por aplicações .NET, e está presente desde a primeira versão do .NET Framework, debaixo do namespace System.Text. Como todos sabemos, essa classe representa uma string mutável, ou seja, ela pode sofrer inserções de novas strings, removê-las ou até mesmo a substituição de caracteres, de forma mais mais simples e performática quando comparada à classe String.

Imagine um cenário onde você tem um laço de repetição e que vai adicionando “linhas” de N caracteres no objeto StringBuilder. Algo mais ou menos como vemos abaixo:

StringBuilder sb = new StringBuilder();
string linha = new string(‘x’, 400);

for (int i = 1; i < 21; i++)
    sb.AppendLine(linha);

Em princípio, tudo funciona muito bem, mas ainda há muito o que melhorarmos. Ao acrescentar caracteres dentro dele, o StringBuilder verifica se o array interno que armazena os caracteres está tentando aumentar além de sua capacidade. Se sim, automaticamente dobrará o tamanho dessa capacidade, alocando um novo array e copiando os caracteres anteriores para este novo e, consequentemente, o array original será descartado, e é justamente esse aumento dinâmico que prejudica a performance.

A classe StringBuilder define uma propriedade chamada Capactiy, que podemos especificar/sugerir a quantidade inicial de memória alocada pela instância corrente. A capacidade pode ser diminuida, mas não pode ser menor que o valor especificado pela propriedade Length, e também não pode ser maior que o valor especificado pela propriedade MaxCapacity. Se executarmos o código que vimos acima e analisarmos a propriedade Capacity, ela retornará 12800, enquanto estamos realmente utilizando 402 caracteres * 20 linhas, que totaliza 8040.

Se você conseguir antecipar a quantidade de caracteres que o StringBuilder deverá ter, irá tirar um melhor proveito dele. Para isso, você pode fazer o uso de um overload do construtor que já nos permite especificar/sugerir a capacidade inicial. Com isso, a única mudança que temos no código acima é a primeira linha:

StringBuilder sb = new StringBuilder(8040);

É importante dizer que especificar a capacidade não quer dizer que quando você atingir este número, você terá uma exceção. Neste caso, internamente ele fará cálculos para poder redimensionar a classe, e acomodar esses novos caracteres. Se desejar impor uma quantidade máxima, então você pode recorrer à propriedade MaxCapacity, que impedirá adicionar mais caracteres do que o valor nela especificado.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s