Desenvolvimento - C#

Concatenação de Strings

O assunto de concatenação de strings já foi discutido várias vezes, já cansei de ler muitos artigos a respeito, mas vejo que muitos desenvolvedores não dão importância ao assunto, é por isso que resolvi mostrar aqui a diferença de desempenho concatenando strings de 4 formas diferentes.

por Márcio Fábio Althmann



Olá.

Sempre que desenvolvemos um software, e ai não importa se é para web, windows ou mobile, temos que nos preocupar com a performance da aplicação, existem softwares que 1 segundo a mais em um processamento no final do mês ou do ano custa muito dinheiro.

E o assunto de concatenação de strings já foi discutido várias vezes, já cansei de ler muitos artigos a respeito, mas vejo que muitos desenvolvedores não dão importância ao assunto, é por isso que resolvi mostrar aqui a diferença de desempenho concatenando strings de 4 formas diferentes.

Aqui não estou me preocupando e nem comparando o consumo de memória, se quiserem posso fazer um artigo comparando isso também.

Basicamente o teste é concatenar 20.000 vezes uma string, eu sei, ninguém tem isso em um sitema ( eu espero ), mas utilizei esse número porque assim conseguiremos ver realmente o que interessa, que é desempenho.

Então chega de falar e vamos ao que interessa.

“a” + “b”

Concatenação de strings do tipo, “Márcio” + “Fábio” é a que mais vejo o pessoal fazendo, eu não gosto, apesar dela ser mais rápida que a segunda opção, eu acho muito ruim ler código com strings concatenadas dessa forma, o código abaixo é o de teste para essa concatenação.

01 var cronometro = new Stopwatch();
02 cronometro.Start();
03
04 var resultado = string.Empty;
05 for (int i = 0; i < 20000; i++)
06 {
07 resultado += i + "-" + i;
08 }
09
10 cronometro.Stop();
11
12 ResultadoStringMaisString.Text = cronometro.Elapsed.TotalSeconds.ToString();

string.Format()

string.Format(“Idade {0}”, 26) é assim que eu costumo utilizar, para concatenar strings pequenas, apesar de ter um desempenho menor que “a” + “b”, o código fica muito mais fácil de entender. O código abaixo é o teste para essa concatenação.

01 var cronometro = new Stopwatch();
02 cronometro.Start();
03
04 var resultado = string.Empty;
05 for (int i = 0; i < 20000; i++)
06 {
07 resultado += string.Format("{0} - {0}", i);
08 }
09
10 cronometro.Stop();
11
12 ResultadoStringFormat.Text = cronometro.Elapsed.TotalSeconds.ToString();

StringBuilder().Append()

Agora a brincadeira fica legal, sempre, novamente, sempre que precisar concatenar várias strings, um ex: quem ainda trabalha com ADO.NET puro, e escreve SQL´s gigantes, fica quebrando linha no Visual Studio para entender o código, e utiliza “a” + “b”, utilize a classe StringBuilder, e nela concatene com o método Append(). O código abaixo é o teste para essa concatenação.

01 var cronometro = new Stopwatch();
02 cronometro.Start();
03
04 var resultado = new StringBuilder();
05 for (int i = 0; i < 20000; i++)
06 {
07 resultado.Append(i + "-" + i);
08 }
09
10 cronometro.Stop();
11
12 ResultadoStringBuilderAppend.Text = cronometro.Elapsed.TotalSeconds.ToString();

StringBuilder.AppendFormat()

Trabalhando com a classe StringBuilder, também temos um método para concatenar como fazemos com o string.Format(), que é o método AppendFormat(), também considero que a concatenação fica mais fácil de entender, mas novamente, o AppendFormat() tem o desempenho menor que o Append(). O código abaixo é o teste para essa concatenação.

01 var cronometro = new Stopwatch();
02 cronometro.Start();
03
04 var resultado = new StringBuilder();
05 for (int i = 0; i < 20000; i++)
06 {
07 resultado.AppendFormat("{0} - {0}", i);
08 }
09
10 cronometro.Stop();
11
12 ResultadoStringBuilderAppendFormat.Text = cronometro.Elapsed.TotalSeconds.ToString();

Em todos os testes eu utilizei a classe Stopwatch que fica no namespace System.Diagnostics para marcar o tempo de execução, os resultados serão mostrados em segundos.

Bom na imagem vemos que a diferença no tempo de execução é incrível, então fica a dica, verifique aquele monte de string concatenada no seu software, e utilize StringBuilder.

No próximo post vou mostrar porque essa diferença ocorre, vamos entender melhor sobre o tipo string, e porque utilizando StringBuilder a diferença é tão grande.

O código fonte do aplicativo está disponível para download.

Márcio Fábio Althmann

Márcio Fábio Althmann