sexta-feira, 1 de fevereiro de 2013

C# - O poder do StringBuilder

Olá, neste post, irei comentar um pouco sobre o poder do StringBuilder.
Quantas vezes não nos deparamos com situações no nosso código em que temos que concatenar strings inúmeras vezes?
Ex: Temos que gerar um relatório de quantas vezes cada usuário do sistema acessou o mesmo.
Para exemplificar em quais momentos devemos utilizar o StringBuilder, desenvolvi o seguinte exemplo:

Criamos uma classe de Usuario que tem os seguintes métodos:
-List<Usuario> ListarUsuariosDoSistema(int qtdUsuarios)
simula a listagem dos usuários de um sistema, onde qtdUsuarios seria a quantidade de usuários que o sistema tem.

-string GerarRelatorioAcessoAoSistema_UtilizandoStringBuilder(int qtdUsuarios)
-string GerarRelatorioAcessoAoSistema_SemUtilizarStringBuilder(int qtdUsuarios)
Cria o relatório,
String.Format("Id:{0} - Nome: {1} - Email: {2} - Número de acessos: {3}",                    usuarioSistema.Id, usuarioSistema.Nome, usuarioSistema.Email, usuarioSistema.AcessosAoSistema) , para cada um dos usuários do sistema.

Simulamos então a geração do relatório utilizando o StringBuilder (GerarRelatorioAcessoAoSistema_UtilizandoStringBuilder), passando o número de usuários do sistema = 10.
Fizemos o mesmo sem utilizar o StringBuilder (GerarRelatorioAcessoAoSistema_SemUtilizarStringBuilder)

Observamos então que o segundo método, sem a utilização do StringBuilder, foi 3 vezes mais veloz, demorando 0,00056 segundos, enquanto o outro método demorou 0,0024 segundos.

Porém em muitos cenários, temos um número muito maior de registros, e nesses casos, o StringBuilder é essencial. Simulamos os mesmos exemplos com 1000 usuários e obtivemos os seguintes resultados:
comStringBuilder: 0,0051 segundos
semStringBuilder: 0,0987 segundos
Observamos então que o primeiro método, com a utilização do string builder, foi 15 vezes mais veloz.

Fizemos um terceiro caso, com 10000 mil usuários, obtendo os seguintes resultados:

comStringBuilder: 0,0630 segundos
semStringBuilder: 15,5369 segundos
Observamos então que o primeiro método, com a utilização do StringBuilder, foi 246 vezes mais veloz.


Percebemos que para casos com pouca concatenação, o uso do StringBuilder tem um desempenho pior, porém quanto maior o número de concatenações, o StringBuilder se torna milhares de vezes mais eficiente do que a concatenação de strings, tanto em questão de tempo como em questão de memória. Isso ocorre por que ao concatenar 2 strings, uma nova instancia de string é criada para suportar o novo valor(uma string é um array de char com tamanho fixo, portanto ao mudar o tamanho da string, uma nova instancia de 'array de char' deve ser criada). Já o StringBuilder trabalha de uma forma diferente, fazendo com que não seja necessário criar uma nova instancia de string.

Abaixo, estou disponibilizando as classes utilizadas para os testes acima, o código fonte pode ser baixado através do link(source) ou através do git hub em:
https://github.com/fsaalmeidinha/poderdostringbuilder.git

Comentem se gostaram ou não, dúvidas, como posso melhorar...

Usuario.cs
Analisador.cs

Nenhum comentário:

Postar um comentário