;

sexta-feira, 17 de dezembro de 2010

Otimizando seu código - StringBuilder

Outro dia li um artigo na web que dizia que, para concatenar texto, a classe StringBuilder é muito mais eficiente do que a classe String (String1 + String2). Ok, até aqui normal. Foi assim que aprendi. Mas o que me chamou a atenção é a diferença absurda nos tempo dos dois métodos. Tanto que fiz meus próprios testes para comprovar.

Escrevi uma rotina bem simples que concatena uma String com outra, 50 mil vezes, só para ver o tempo que levaria. Fiz isto usando uma String (String1 + String2) e fiz com StringBuilder. Veja abaixo o resultado que obtive. O tempo está em segundos.


É uma diferença considerável. Claro que se você for concatenar Strings uma ou duas vezes, não vai perceber a diferença. Mas agora imagine uma aplicação acessada por milhares de clientes diariamente, onde esta operação é feita inúmeras vezes. No fim do dia o StringBuilder vai fazer a diferença. 

Isto acontece porque cada vez que concatenamos uma String, é criado um novo objeto e alocado na memória. O StringBuilder já pré-aloca um espaço na memória, e a cada alteração, altera o mesmo objeto. Tanto que, se você souber o tamanho que esta String vai ter, pode setar a capacidade do objeto, otimizando ainda mais seu código.

Mas tire você mesmo suas conclusões. Faça o teste e poste aqui o resultado obtido. A rotina que usei para fazer o teste é esta:
      
        private static void executaTeste()
        {
            String str = "";
            StringBuilder strB = new StringBuilder();

            double tmpConc = 0;
            double tmpBldr = 0;
            DateTime tmp1 = DateTime.Now;

            for (int i = 0; i < 50000; i++)
                str = str + "a";

            tmpConc = DateTime.Now.Subtract(tmp1).TotalSeconds;

            DateTime tmp2 = DateTime.Now;

            for (int i = 0; i < 50000; i++)
                strB.Append("a");

            tmpBldr = DateTime.Now.Subtract(tmp2).TotalSeconds;

            Console.WriteLine("Resultado");
            Console.WriteLine();
            Console.Write("Usando String: ");
            Console.WriteLine(tmpConc);
            Console.WriteLine();
            Console.Write("Usando StringBuilder: ");
            Console.WriteLine(tmpBldr);
            Console.ReadLine();
        }

Abraços.

3 comentários:

Thiago disse...

Boa dica mesmo!
Utilizei pra montar um menu no projeto
O Blog tá ficando bueno, coloquei nos favoritos
Um quebra costela

Gabriel Bauermann disse...

Valeu a força Thiago.

E sempre que quiser contribuir, sugerir um tema ou fazer alguma crítica, fique a vontade. A casa é sua.

Grande abraço

Marcelo Schumacher disse...

Mas ah, seu nerd!
Ficou muito boa a tua prova real!
Sucesso ae no blog!
:)

Postar um comentário