.NET

6 jul, 2011

Por que usar StringBuilder?

Publicidade

Você concatena strings com concatenação comum ou usa o StringBuilder?

Há alguns dias, fui questionado sobre isso e na hora me veio a ideia de fazer um teste para comparação.

1) Conceitos

StringBuilder: http://msdn.microsoft.com/en-us/library/2839d5h5(v=VS.100).aspx

String: http://msdn.microsoft.com/en-us/library/362314fe(v=VS.100).aspx

Obs.: Coloquei apenas os links por serem conceitos já conhecidos entre nós.

2) Testes

Fiz um pequeno programa que simula uma grande quantidade de concatenações de strings ou appends em StringBuilders. A ideia é um bloco for o que concatena uma string várias vezes e outro bloco for que faz vários appends em um StringBuilder. Algo deste tipo:

// Várias concatenações na string
string str = string.Empty;
for (int i = 1; i <= qt; i++)
    str = str + " Concatenação nº " + i.ToString();
// Vários appends no StringBuilder
StringBuilder stb = new StringBuilder();
for (int i = 1; i <= qt; i++)
{
    stb.Append(" Append nº ");
    stb.Append(i.ToString());
}

A diferença de performance foi de impressionar. Veja:

No teste, foram executadas 100 mil concatenações/appends, e o tempo de execução das concatenações foi absurdamente maior que o tempo de execução dos appends.

A partir de agora, use StringBuilder em vez de strings comuns quando o número de concatenações for muito grande. Logo abaixo veremos o motivo.

3) Explicações

Toda vez que o conteúdo de uma string é alterado, um novo objeto string é criado na memória, o que requer uma nova alocação de espaço para esse novo objeto. Em situações em que é necessário realizar repetidas modificações em uma string (como o caso do exemplo acima), a sobrecarga associada à criação de um novo string pode ter um custo muito caro, tanto em tempo de execução, quanto em uso de memória. O StringBuilder pode ser usado para esses casos de necessidade de modificar strings sem criar um novo objeto.

O StringBuilder representa uma sequência de caracteres cujo valor pode ser modificado. Dizer que o valor pode ser modificado significa que pode ser alterado depois de ter sido criado, acrescentando, removendo ou substituindo caracteres.

O desempenho de uma operação de concatenação de um String ou StringBuilder depende da frequência na qual a alocação de memória ocorre. Como já disse, um string sempre aloca memória a cada concatenação (alteração). Já com o StringBuilder, a operação de concatenação aloca memória apenas para os novos conteúdos adicionados. Consequentemente, string é preferível apenas para operações de concatenação com um número fixo de objetos a serem concatenados. Nesse caso, as operações de concatenação são combinadas em uma única operação pelo compilador. Já o StringBuilder é preferível para uma operação de concatenação quando um número grande de concatenações devem ser realizadas.

Código-fonte

Baixe o código-fonte do teste aqui.

Referências