Diferença entre StringBuffer e StringBuilder

10 respostas
N

Alguém sabe a diferença entre StringBuffer e StringBuilder?

Obrigado,

Nadilson

10 Respostas

M

Até!

U

StringBuffer é synchronized
StringBuilder não é …

ou seja, StringBuilder tende a ser bem mais rápido

V

A busca no próprio forum as vezes ajuda :wink: :
http://www.guj.com.br/posts/list/48531.java

Eu também duvido que a performance das duas seja assim tão diferente.

U
na verdade é uma diferença consideravel sim ... por exemplo, olha este teste:
package teste;

public class TesteSB {
	public static void main(String[] args) {
		long tm = System.currentTimeMillis();
		testeBuffer();
		System.out.println(System.currentTimeMillis()-tm);
		tm = System.currentTimeMillis();
		testeBuilder();
		System.out.println(System.currentTimeMillis()-tm);
	}

	private static void testeBuffer() {
		StringBuffer sb = new StringBuffer();
		for(int i=0;i&lt10000000;i++) {
			sb.append(i);
		}
	}
	private static void testeBuilder() {
		StringBuilder sb = new StringBuilder();
		for(int i=0;i&lt10000000;i++) {
			sb.append(i);
		}
	}
}

o output dele é:
3373
2951

ou seja, a diferença é de praticamente 14% só neste caso com inteiros, e pode aumentar dependendo da forma como for utilizada ...

V

Primeiro, cuidado com o microbenchmark.

Em segundo lugar, mesmo o seu benchmark indica que em 10000000 concatenações, você teve 1 segundo de tempo a mais. Ok, são 14%, mas ambas as classes são rápidas o suficiente para que, na absoluta maioria das vezes, isso não seja perceptível ao usuário final.

V

Só um comentário.

Inverti o Buffer e o Builder e fiz um segundo teste… A diferença caiu muito.

Creio que na primeira execução o Java gere algum tipo de buffer, que beneficia quem roda em segundo lugar.

Por isso novamente: cuidado com o microbenchmark.

Ainda assim, eu usaria o StringBuilder no lugar do Buffer. Não só pelo fato de ser mais rápido, mas também por não criar estruturas necessárias para a exclusão mútua entre as Threads. Fora que, via de regra, você não precisa de uma classe ThreadSafe.

U

extranho, eu inverti aqui e tive exatamente o mesmo resultado …

mas tudo bem, foi só um exemplo …
e se tu quer tanto cuidado com o microbenchmark …
então adiciona um outro loop igual mas com concatenação de strings e fica esperando ele terminar :smiley:

V

Concatenação de string sim, dá uma diferença realmente consideravel.

Agora, quanto a sincronização, dá uma lida aqui. :wink: :
http://www-128.ibm.com/developerworks/java/library/j-jtp04223.html?ca=dgr-lnxw07-obg-JavaMyths

E sobre benchmark (muito do que diz aqui vale para esse caso):
http://www-128.ibm.com/developerworks/java/library/j-jtp02225.html

Ah sim, note que eu não disse que não era mais lento. Isso é… mas só que a diferença não será perceptível, na maior parte das vezes (como no caso da concatenação).

L

Pow…muito legal seus posts Vini! Foram muito bons para desmistificar alguns mitos! Esses artigos da IBM são bem legais.

Parabéns

Abraços!

N

Muito obrigado por todas as respostas.

Criado 19 de janeiro de 2007
Ultima resposta 23 de jan. de 2007
Respostas 10
Participantes 5