| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/05/2008 23:14:08
|
dark_creator
JavaBaby
Membro desde: 07/09/2006 16:31:02
Mensagens: 84
Offline
|
Bom, estou lendo o Livro da Kathy e acabei com uma duvida sobre string.
no livro no exemplo so muda o nome das variaveis e strings.
é isso mesmo?
e outra duvida
total: 5 objetos string no pool e 2 deles referenciados
é isso mesmo? estou certo?
existe diferença entre o
e o
????????
This message was edited 1 time. Last update was at 19/05/2008 23:18:04
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/05/2008 23:41:20
|
blackfalcon
JavaEvangelist
![[Avatar]](/images/avatar/67cba9ae9e4555079d1751ea3d187147.jpg)
Membro desde: 01/04/2008 21:08:28
Mensagens: 347
Offline
|
Cara, sobre a pergunta nem consigo te responder... mas ja li a respeito que nem se usa o tipo String ( so para programinhas que nem a gente faz.. ) , usa-se outras duas classes, se alguem tiver mais informação pro cara..
Abraços
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 06:58:44
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
Fiz aqui um tester para poder ver melhor como a coisa funciona:
Resultado:
Moral da história... o Concat é mais fácil e mais rápido...
This message was edited 2 times. Last update was at 20/05/2008 07:08:27
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 07:08:09
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Por que você está chamando delete usando o StringBuilder e o StringBuffer?
Com uma operação a mais a cada loop, vai dar mais lento mesmo!
|
@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) 20/05/2008 07:09:01
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
ViniGodoy wrote:Por que você está chamando delete usando o StringBuilder e o StringBuffer?
Com uma operação a mais a cada loop, vai dar mais lento mesmo!
Mudei o delete para setLength e da no mesmo... entao como resetar para usar o mesmo objeto???
E se o StringBuilder/StringBuffer estivesse dentro de um método chamado apartir do loop, seria criado N objetos a mais como demonstrado no primeiro exemplo, uma grande perda de performance, então o concat passa a ser o ideal a ser usado, ou não?
Creio q o concat em todos os casos vai se sair bem... sendo assim devemos usar o concat em vez do StringBuffer/StringBuilder? Sempre?
This message was edited 3 times. Last update was at 20/05/2008 07:13:56
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 07:14:12
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
No caso do String Builder / Buffer você está medindo não só o tempo da concatenação, mas também o tempo que ele leva para instanciar um objeto String no final. E é justamente esse tempo que se ganha ao utiliza-lo. Teste outro benchmark concatenando 123 !!! várias vezes numa mesma string e só ao final gerando o resultado com toString() (que é como se normalmente se trabalha com o StringBuilder e StringBuffer). Talvez você obtenha resultados diferentes. Não seja tão apressado ao concluir coisas baseado em resultados de microbenchmarks já que, assim como o seu, muitos expressam só parcialmente o que ocorre na realidade (ou não expressam nada). Benchmarks como esse também levam em pouca consideração caches e compilações hotspot feitas pela VM. O que o seu benchmark nos leva a concluir é que, para pequenas concatenações, o sinal de + é o mais rápido, seguido pelo concat. Mas será que isso seria válido para as grandes concatenações?
This message was edited 1 time. Last update was at 20/05/2008 07:16:00
|
@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) 20/05/2008 07:23:56
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Veja só um exemplo. Passei o StringBuilder para primeiro na ordem de execução e obtive os seguintes resultados: Test 1 ---------------------------------------- StringBuilder = 2594ms Plus = 15ms Concat = 1922ms StringBuffer = 4719ms ---------------------------------------- Test 2 ---------------------------------------- StringBuilder = 1781ms Plus = 2610ms Concat = 1890ms StringBuffer = 2078ms ---------------------------------------- Test 1 ---------------------------------------- StringBuilder = 2593ms Plus = 0ms Concat = 1922ms StringBuffer = 4766ms ---------------------------------------- Test 2 ---------------------------------------- StringBuilder = 1812ms Plus = 2610ms Concat = 1875ms StringBuffer = 2234ms ---------------------------------------- Que tipo de maluquice será que a VM faz por trás de tudo?!? O seu resultado também mostra uma discrepancia. Como você pode concluir a respeito do concat com a aquela variação enorme no tempo do plus? Essa variação pode ter ocorrido em todos os seus resultados, afetando todo o tempo do teste. Isso provavelmente é o garbage collector e outros mecanismos da VM rodando.
This message was edited 1 time. Last update was at 20/05/2008 07:26:37
|
@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) 20/05/2008 07:28:15
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
Mas não superou o concat...
Eu estou fazendo um novo benchmark com uma concatenação maior, e no primeiro teste mesmo o StringBuilder e o StringBuffer sendo criados varias vezes ja foram muito mais rapido...
Quando acabar o teste posto aqui o codigo e o resultado... é q esta demorando o segundo teste
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 07:32:31
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
Pronto... agora sim... tive q baixar os valores por q estava demorando muitooo:
Resultado:
Agora é estudar quando usar cada um em cada caso explorando o ponto forte...
O q me espanta é o StringBuilder ter sido mais rápido no primeiro caso...?!
This message was edited 1 time. Last update was at 20/05/2008 07:34:12
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 07:36:57
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
ok... fiz outros testes... e o:
Não podem ser levados em consideração... é o mesmo q Zero claro
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 07:41:41
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Mudei um pouco o programa:
Agora concateno coisas diferentes, de mesmo tamanho. Assim ninguém se beneficia de strings internalizadas no pool.
Os resultados já foram mais consistentes:
Test 1
----------------------------------------
StringBuilder = 2344ms
Plus = 17609ms
Concat = 19204ms
StringBuffer = 2343ms
----------------------------------------
Test 2
----------------------------------------
StringBuilder = 2328ms
Plus = 13500ms
Concat = 19360ms
StringBuffer = 2344ms
----------------------------------------
Quer tentar rodar no seu também (além de conferir o código)? Acho que estamos conseguindo filtrar parte do ruído.
|
@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) 20/05/2008 08:46:32
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
exato, deu o dobro
Bem mas isto é concatenação grande, concatenação curta, continua sendo o problema.
Se tenho um método q cria um StringBuilder e faz uns appends, e depois por acaso alguem chama este método dentro de um loop, e ai como ficamos?
Então sempre q for simples concactenações devemos usar o concat? Que o + só é mais rápido quando são strings estáticas, se tiver uma string como variável ai já é mais demorado que o concat, como no primeiro benchmark.
Certo?
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 08:51:43
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
Ou seja se formos fazer um return... Isto estaria errado: Assim é o correto: Se for duas strings estaticas, o certo é: Mas no caso de duas strings estaticas não há razão para fazer somas lol E tudo q for concatenações massivas sempre StringBuilder e em problemas especificos de sincronismo o StringBuffer. De acordo?
This message was edited 2 times. Last update was at 20/05/2008 08:54:59
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2008 10:37:05
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
De acordo. De qualquer forma, a experiência foi interessante.  Ainda assim, a dica da Sun é válida: Na dúvida use StringBuilder. Em poucas concatenações curtas, a diferença de tempo não será significativa. (Afinal, elas são curtas mesmo) Numa longa, a performance dele é muito melhor. Claro, se você souber que existe uma série de concatenações curtas, especialmente se for baseada em valores parecidos, aí pode usar o concat. Mas é sempre bom saber dessas diferenças.  E a moral da história. Não se apressar em concluir coisas com benchmarks. O ideal é ficar atentos a diferença muito grandes de número e valores, especialmente entre 2 ou 3 execuções. Essas diferenças geralmente indicam ruídos (garbage collection, alocação de memória, etc) que tem que ser filtrados.
This message was edited 1 time. Last update was at 20/05/2008 10:39:16
|
@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) 20/05/2008 12:55:39
|
eduveks
GUJ Ranger
![[Avatar]](/images/avatar/bce9abf229ffd7e570818476ee5d7dde.png)
Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline
|
ya foi uma boa experiência!
sim, mais bom senso nos benchmarks pra próxima, vou tentar
e isto de usar o concat ou StringBuilder, já vi muita gente dizendo e fazendo new StringBuilder pra tudo e mais um pouco e eu tb já fiz muito isso, e sempre fiquei com a pulga atrás da orelha em usar StringBuilder sempre.
valew a experiência, agora esta tudo mais claro
|
http://www.cajuscript.org
http://eduveks.blogspot.com |
|
|
 |
|
|