Diferença entre StringBuffer e StringBuilder

10 respostas
nadilsons

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

Obrigado,

Nadilson

10 Respostas

maquiavelbona

Até!

urubatan

StringBuffer é synchronized
StringBuilder não é …

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

ViniGodoy

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.

urubatan
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 ...

ViniGodoy

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.

ViniGodoy

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.

urubatan

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:

ViniGodoy

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!

nadilsons

Muito obrigado por todas as respostas.

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