Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Por que usar StringBuilder?

Recommended Posts

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:

 

37260.jpg

 

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

 

 

http://imasters.com.br/artigo/21125/dotnet/por-que-usar-stringbuilder

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.