terça-feira, 12 de abril de 2016

Diferença entre String, StringBuilder e StringBuffer em Java #2


Esse é o segundo post sobre "Diferença entre String, StringBuilder e StringBuffer em Java", caso tenha perdido o primeiro post clique aqui para acompanhar o assunto.


Anteriormente aviamos avaliado o desempenho quando concatenamos vários caracteres "f", utilizando String. Podemos concluir que utilizar String para concatenar strings pode ser muito prejudicial para o desempenho do seu código.

Hoje vamos analisar a diferença do tempo de processamento entre String e StringBuilder.
Para facilitar, vamos utilizar o mesmo código anterior, realizando pequenas adaptações, para vermos de fato a velocidade de execução do StringBuilder
  • Comparando performance de String e String Builder
public class ConcatenaString {

    public static void main(String[] args) { 
              
        // Trecho de código para String
        String strFinal = "";
        long tStart = System.currentTimeMillis(); 
        
        // Vamos concatenar 100000 vezes o caractere 'f', 
        // então relembremos que cada vez que passarmos no laço 
        // a JVM irá criar um novo objeto em memória.
        for (int i = 0; i < 100000; i++) {
            strFinal += "f";
        }

        long tEnd = System.currentTimeMillis();
        long tResult = tEnd - tStart;
        System.out.println("Tempo de execução com String = " + tResult + " ms"); 
        
        // Trecho de código para StringBuilder
        StringBuilder strBuilder = new StringBuilder();
        tStart = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            strBuilder.append("f");
        }

        tEnd = System.currentTimeMillis();
        tResult = tEnd - tStart;
        System.out.println("Tempo de execução com StringBuilder = " + tResult + " ms");
    }
}
Tempo de execução com String = 14627 ms
Tempo de execução com StringBuilder = 0 ms

Na minha máquina ao executar o código acima, a saída foi de 14627ms para String com o operador "+" e 0ms para o StringBuilder. Foram utilizados apenas 100mil caracteres, mas vamos imaginar se aumentássemos em 10x esse valor... Seria 1milhão de caracteres.

Altere o valor do seu código e verifique a o tempo de processamento.

Perceba que para não tornar o teste tendencioso, coloquei o tInicio e o tFim no início e no fim do laço "for", dessa forma desconsideramos qualquer outro código que venha antes ou depois, por exemplo as atribuições e escritas no console, assim avaliamos puramente a concatenação de ambos.

Sem dúvidas a performance do StringBuilder comparado a String comum é muito melhor quando precisamos concatenar valores.

O que acontece na verdade é que StringBuilder é mútavel, ou seja, a cada "append(valor)" que fizemos no laço, concatenamos de fato um novo valor a String já existente, sem a necessidade da criação de um novo objeto em memória. Mas e qual a diferença entre StringBuilder e StringBuffer? A resposta fica para o próximo post. Até a próxima.

Nenhum comentário:

Postar um comentário