| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/10/2010 11:41:44
|
narciso.benigno
Debugger
Membro desde: 06/07/2010 19:49:25
Mensagens: 71
Localização: São Paulo
Offline
|
Olá amigos,
Recentemente fiz um curso de Spring, e como curiosidade o professor Douglas Campos, citou uma coisa muitíssimo interessante: hoje usar o operador + para concatenar string pode ser uma boa opção em grande parte dos casos (a partir da hotspot do Java 6). Porque o compilador vai transformar isto para a concatenação com StringBuilder.
Isto me deixou muito intrigado, e foi procurar alguma referência oficial da Sun para escrever este post, e disseminar esta informação. Encontrei, cumprindo a premissa de quem procura acha!!! Porém!!! Achei a referencia de performance da Sun um pouco antiga, e lá no capitulo sobre imutabilidade ele diz o seguinte:
/*disponível em: http://java.sun.com/docs/books/performance/1st_edition/html/JPMutability.fm.html#22028*/
Concatenating String objects
The javac compiler would automatically transform this to
Observe que é StringBuffer, mas como o StringBuffer não é mais recomendado pela Oracle/Sun (Sei lá como chamo isto), isto foi atualizado para usar o StringBuilder.
Se alguém tiver uma referência oficial atualizada sobre isto post por favor!
Grande Abraço!
|
http://njalldev.wordpress.com
@nj_all |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/10/2010 12:14:51
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
Está correto! A unica questao é que a partir do Java 5 o compilador vai gerar com StringBuilder e não com StringBuffer.
Realmente é preciso pensar com cuidado nas otimizacoes que fazemos com concatenacoes de strings porque no fundo é tudo StringBuilder. Mas esse caso de concatenar num for é um classico onde ainda precisamos escrever o StringBuilder na mao para nao sofrer com a performance.
Repare que quando voce faz o for com + o compilador gera a concatenacao com StringBuilder. Mas como voce atribui o resultado de volta numa String, ele precisa criar um StringBuilder novo a cada iteracao e chamar o toString de volta. O que, claro, não é muito performatico se voce precisar da String so no final do for (repare que o compilador nao tem como saber isso, por isso gera o codigo "ruim").
Para melhorar a performance, vc precisa fazer o codigo classico de criar o StringBuilder fora do for e depois só chamar o append dentro do laço. E após o for chamar o toString uma unica vez. Aí vai ficar bem mais rapido!
E um ultimo comentario: o compilador transforma concatenacoes de String em StringBuffer/Builder desde sempre (não só Java 6). O que mudou foi que no Java 5 em diante ele deixou de usar StringBuffer e passou a usar StringBuilder.
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/10/2010 12:18:03
|
qmx
JavaGuru
Membro desde: 14/02/2007 10:49:14
Mensagens: 212
Localização: Sampa
Offline
|
Boa Sérgio!
Apenas acrescentando, tem um post do paulo silveira (pt-br) e um paper bem interessante a respeito de performance de concatenação de strings (inglês). Vale a leitura!
This message was edited 1 time. Last update was at 15/10/2010 12:19:48
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/10/2010 13:07:51
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Agora, note que num loop, o uso do StringBuilder implícito pela VM não criou nada mais otimizado. O loop que você mesmo colocou mostra isso: É criado um stringBuffer a cada iteração, e sobre ele é chamado o toString(), resultando numa nova String. O custo de alocação desse novo objeto ainda existe e, portanto, não houve ganho de performance.
O que seu professor falou, é que para os casos das concatenações simples, isso já está otimizado:
É equivalente a:
Agora, num loop, você ainda precisa criar o StringBuilder manualmente.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/10/2010 14:46:13
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Ressaltando o que o ViniGodoy afirmou, façam o seguinte teste:
E postem aqui os tempos obtidos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/10/2010 15:01:53
|
narciso.benigno
Debugger
Membro desde: 06/07/2010 19:49:25
Mensagens: 71
Localização: São Paulo
Offline
|
Show de bola pessoal,
Eu realmente havia feito alguns testes com isto, para o caso de concatenação simples sempre utilizei StringBuffer e depois StringBuilder por que não tinha este conhecimento que o compilador fazia este esforço para otimizar (claro que depois desta explicação de vocês podemos definir como proibitivo para os casos que vai concatenar em um looping), me parece que esta otimização é uma coisa pouco conhecida pela comunidade Java. Muito obrigado pelas referências, os testes e a paciência!
Abraços
|
http://njalldev.wordpress.com
@nj_all |
|
|
 |
|
|