Utilizar StringBuffer me vez de Strings  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
leopoldof
GUJ Master

Membro desde: 07/03/2008 07:40:45
Mensagens: 1012
Offline

Estava eu fazendo uma rotina para ler um arquivo de texto que no sistema...esse tipo de arquivo tem aproximadamente umas 53.000 linhas....

depois de lido e armazenado o conteúdo do arquivo numa string, tenho que ver linha por linha para modificar alguns valores contidos nesta string...

após isso...devo inserir essa nova string modificada em um novo arquivo...

Só que percebi uma diferença de tempo de processamento exorbitante....mas exorbitante meeeessssmmooo entre usar
Strings e usar StringBuffer...... não é diferença de segundos..... mas sim de meia hora... pra mais...

por exemplo...
//CÓDIGO LENTO

//CÓDIGO + RÁPIDO



Agora a pergunta....porque?????????? porque a enorme diferença de tempo de execução e memória...entre uma string e um StringBuffer.... nos meus códigos...vo usar onde puder só stringbuffer..em vez de strings...
diego.sas
JavaEvangelist
[Avatar]

Membro desde: 27/06/2008 09:59:07
Mensagens: 313
Localização: São Paulo
Offline

Porque a String é imutável, cada vez que faz a iteração é criada uma nova String e atribuida o valor para ela.
Se você utilizar StringBuilder fica mais rapido ainda...

Diego Sales.
Quando penso que já sei todas as respostas. Vem a vida e muda todas as perguntas!
[MSN]
jaboot
Virtual Machine Man

Membro desde: 01/07/2005 14:25:37
Mensagens: 749
Localização: São Paulo
Offline

E provavelmente se você utilizar o StringBuilder, vai ficar um pouquinho mais rápido.

Uma parte da tua resposta pode estar aqui - http://www.guj.com.br/java/27728-stringbuffer

Falwz!
[MSN] [ICQ]
wellington.nogueira
GUJ Ranger
[Avatar]

Membro desde: 11/08/2006 11:29:56
Mensagens: 914
Localização: Osasco-SP
Offline

E troque esta parte do teu código:

por


Note que agora o \n está entre aspas simples, ou seja, ele passou a ser char.

57 45 4C 4C 49 4E 47 54 4F 4E
Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
"Se você acha que programar em Java com Swing é simples? Acredite em mim, não é!"
http://developmentforever.wordpress.com/
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

Ou, se quiser economizar DEDO, use o chain: strNovoArquivo.append( token).append('\n');

ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
wellington.nogueira
GUJ Ranger
[Avatar]

Membro desde: 11/08/2006 11:29:56
Mensagens: 914
Localização: Osasco-SP
Offline

fabim wrote:Ou, se quiser economizar DEDO, use o chain: strNovoArquivo.append( token).append('\n');

Ia escrever assim, mas pra quem está aprendendo, linha a linha é um pouco mais legível mas eu mesmo prefiro essa forma de implementar.

57 45 4C 4C 49 4E 47 54 4F 4E
Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
"Se você acha que programar em Java com Swing é simples? Acredite em mim, não é!"
http://developmentforever.wordpress.com/
jaboot
Virtual Machine Man

Membro desde: 01/07/2005 14:25:37
Mensagens: 749
Localização: São Paulo
Offline

hahahaha

Tá engraçado isso, mas interessante!

Eu sou muito chato... pra qualquer coisa com Strings, eu uso o StringUtils da apache... resolve qualquer problema.
[MSN] [ICQ]
Ivan Sotelo Codo
Debugger

Membro desde: 03/11/2008 13:28:01
Mensagens: 70
Localização: São Paulo - SP
Offline

Bom, só complementando o que já foi dito acima, Strings são imutáveis, então o que acontece é mais ou menos o seguinte:
quando vc faz isso
String texto = "blablabla";

Criou uma String texto contendo blablabla, até aí tudo bem.
Quando faz:
texto= "blablabla" + "abcd";
criou mais duas Strings: a "abcd" e e "blablablaabcd", só que vc só tem uma referência apontando para "blablablaabcd", as outras duas Strings "blablabla" e "abcd" ficam vagando na memória, imutáveis esperando alguém referenciá-las e usá-las novamente e isso pode nao acontecer nunca. Um dia quem sabe, isso independe da nossa vontade, mesmo que a gente tente forçar, a gc pode passar por lá e dar uma limpada nisso, mas enquanto isso não acontece, sua memória vai pro espaço. Por isso, sempre que possível use StringBuffer ou StringBuilder, não me lembro agora qual dois dois é ThreadSafe mas acho que o StringBuilder é ainda mais rápido.

Espero ter ajudado.

Abraços

************
[Email] [WWW] [Yahoo!] aim icon [MSN] [ICQ]
diego.sas
JavaEvangelist
[Avatar]

Membro desde: 27/06/2008 09:59:07
Mensagens: 313
Localização: São Paulo
Offline

Ivan Sotelo Codo wrote:Bom, só complementando o que já foi dito acima, Strings são imutáveis, então o que acontece é mais ou menos o seguinte:
quando vc faz isso
String texto = "blablabla";

Criou uma String texto contendo blablabla, até aí tudo bem.
Quando faz:
texto= "blablabla" + "abcd";
criou mais duas Strings: a "abcd" e e "blablablaabcd", só que vc só tem uma referência apontando para "blablablaabcd", as outras duas Strings "blablabla" e "abcd" ficam vagando na memória, imutáveis esperando alguém referenciá-las e usá-las novamente e isso pode nao acontecer nunca. Um dia quem sabe, isso independe da nossa vontade, mesmo que a gente tente forçar, a gc pode passar por lá e dar uma limpada nisso, mas enquanto isso não acontece, sua memória vai pro espaço. Por isso, sempre que possível use StringBuffer ou StringBuilder, não me lembro agora qual dois dois é ThreadSafe mas acho que o StringBuilder é ainda mais rápido.

Espero ter ajudado.

Abraços


O StringBuffer é ThreadSafe, por isso o motivo do StringBuilder ser mais rápido...
Abraços

Diego Sales.
Quando penso que já sei todas as respostas. Vem a vida e muda todas as perguntas!
[MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team