| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 16:10:47
|
snoopsis
Smalltalk
Membro desde: 11/03/2009 13:40:07
Mensagens: 1
Offline
|
Ola pessoal estou a estudar as apostilas da caelum e tou com duvidas neste exercicio que axo que nao fiz da melhor maneira e agradecia que me explicassem melhor se possivel obrigado.
This message was edited 2 times. Last update was at 12/03/2009 16:21:34
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 16:21:12
|
j_chist
Thread.start()
Membro desde: 11/06/2006 22:43:37
Mensagens: 35
Offline
|
Você quer um algoritmo melhor para imprimir os múltiplos de 3 entre 1 e 100?
Eu usaria módulo.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 16:29:46
|
avsouza
Virtual Machine Man
![[Avatar]](/images/avatar/752a6fc94c80ba4f8b2dc8506fcc87f3.jpg)
Membro desde: 03/08/2007 13:04:42
Mensagens: 660
Localização: Florianópolis/SC
Offline
|
This message was edited 2 times. Last update was at 12/03/2009 16:31:00
|
Alexandre Vieira de Souza
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 16:43:14
|
rdgc
JavaGuru
Membro desde: 09/05/2006 17:34:17
Mensagens: 209
Localização: São Paulo - SP
Offline
|
Não sei qual é a intensão do exercício e não entendi sua dúvida... mas vai um exemplo:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 17:34:10
|
rodpuc
Java Ninja
![[Avatar]](/images/avatar/631ceaa1abe4dcc8659f7477bbe1f4bf.png)
Membro desde: 17/08/2006 14:55:20
Mensagens: 299
Offline
|
O código do rdgc é o mais eficiente. Por módulo tb está correto, mas vc faz mais cálculos e ainda tem um if. Não q seja o fim do mundo, mas só p vc entender.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 18:25:31
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
Nem tudo é como parecer ser!
Se vocês pretendem deixar o código otimizado ao máximo, devem fazer apenas uma chamada de sistema operacional para imprimir na tela. Para isso precisa armazenar o resultado em memória para depois imprimir apenas uma vez. Utilizar String para isso é inviável em termos de performance, pois ela é imutável. StringBuffer é a classe eficaz para concatenar muitas Strings, pois ela é mutável. StringBuilder faz a mesma coisa, só que previne a concatenação ao objeto de duas ou mais Threads, nesse exemplo não é nececessária pois existe só a Thread padrão que executa o método main().
Eis o código:Para computar e imprimir todos múltiplos de 3 de 1 até 10.000 levou-se 234 milisegundos.
Para aquele código inicial:Para computar e imprimir todos múltiplos de 3 de 1 até 10.000 levou-se 953 milisegundos.
Para aquele código incrementando de três em três:Para computar e imprimir todos múltiplos de 3 de 1 até 10.000 levou-se 938 milisegundos.
Claro que esses tempos podem variar de acordo com a preempção da Thread que executa o código. Mas pelo que vocês podem ver, imprimir na tela uma vez sequer é muito, muito, muito mais lento do que uma simples otimização de incremento.
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 23:22:39
|
maquiavelbona
JWizard
![[Avatar]](/images/avatar/24bea84d52e6a1f8025e313c2ffff50a.jpg)
Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline
|
Sua mensagem está meio certa. Primeiro: - Sim, fazer uma só chamada ao SO torna o seu código mais rápido. - Agora é quase que falácia dizer que concatenar Strings é mais lento que usar StringBuffer/StringBuilder. Quer saber por que? Aprenda a usar o javap. Até!
This message was edited 1 time. Last update was at 12/03/2009 23:23:06
|
----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)
"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2009 23:49:52
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
maquiavelbona wrote:
- Agora é quase que falácia dizer que concatenar Strings é mais lento que usar StringBuffer/StringBuilder.
Se for quase que falácia, então me explique pq esse código com StringBuffer roda em 47ms.
E me explique pq esse código abaixo que concatena strings roda em 11422ms.
Como se vê, é concatenação em Strings versus concatenação em StringBuilder.
Ainda não enxerguei nenhuma falácia no que eu disse.
This message was edited 2 times. Last update was at 12/03/2009 23:52:36
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/03/2009 07:10:50
|
diegosantiviago
JavaGuru
Membro desde: 14/12/2008 11:53:44
Mensagens: 221
Localização: BR
Offline
|
This message was edited 1 time. Last update was at 13/03/2009 07:33:26
|
SCJA, SCJP, SCBCD, SCEA (I), IBM SOA, ITIL v3 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/03/2009 07:31:44
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline
|
dionat4n wrote:StringBuilder faz a mesma coisa, só que previne a concatenação ao objeto de duas ou mais Threads
Você trocou as bolas ao explicar do StringBuffer e do StringBuilder nesse caso. O StringBuffer é sincronizado e previne o acesso concorrente, e o StringBuilder, não. Portanto, corrija os seus exemplos para usar o StringBuilder, não o StringBuffer. Veja o que diz a documentação do StringBuffer: "As of release JDK 5, this class has been supplemented with an equivalent class designed for use by a single thread, StringBuilder. The StringBuilder class should generally be used in preference to this one, as it supports all of the same operations but it is faster, as it performs no synchronization." Na prática, raramente você utilizará o StringBuffer, pois o acesso concorrente a um único buffer raramente faz sentido. A sincronização só previne que o método append() não seja chamada por duas threads simultâneas, porém, ela não garante nada sobre o que acontece entre duas chamadas ao método append. Por exemplo, se o código strBuf.append("15/09/1980 ").append("log line "); For executado por duas threads diferentes a saída poderá ser "15/09/1980 log line 15/09/1980 log line" ou poderá ser "15/09/1980 15/09/1980 log line log line". O que ela não poderá ser (já que o StringBuffer é sincronizado) é "15log/09/li19ne80 15log/09/li19ne80 ". A solução para isso é sincronizar a classe que contém o StringBuffer, mas nesse caso, a sincronização do buffer em si torna-se desnecessário, e podemos substitui-lo por um stringBuilder. A concatenação de Strings realmente é mais rápida com essas classes. Ela só não é mais rápida em casos assim: Que o java irá substituir invariavelmente por: Mas, realmente, dentro de um while o tempo é incomparavelmente menor, como você mesmo demonstrou.
This message was edited 7 times. Last update was at 13/03/2009 08:17:54
|
@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) 13/03/2009 07:44:50
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline
|
Outra coisa que eu notei...
Já que você está usando o StringBuilder, não use a contatenação dentro do método append, foi feito na linha 7 do programa:
Dessa forma, você pode voltar a incorrer nos custos que queria evitar. No lugar, use o método append do próprio StringBuilder. Uma característica interessante é que esse método retorna o próprio StringBuilder, o que permite-nos chamar em cadeia:
Melhor que isso, só se a Sun tivesse escolhido a palavra add no lugar de append...
|
@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) 13/03/2009 07:56:59
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
ViniGodoy wrote:
dionat4n wrote:StringBuilder faz a mesma coisa, só que previne a concatenação ao objeto de duas ou mais Threads
Você trocou as bolas ao explicar do StringBuffer e do StringBuilder nesse caso. O StringBuffer é sincronizado e previne o acesso concorrente, e o StringBuilder, não. Portanto, corrija os seus exemplos para usar o StringBuilder, não o StringBuffer. Veja o que diz a documentação do StringBuffer:
"As of release JDK 5, this class has been supplemented with an equivalent class designed for use by a single thread, StringBuilder. The StringBuilder class should generally be used in preference to this one, as it supports all of the same operations but it is faster, as it performs no synchronization."
Na prática, raramente você utilizará o StringBuffer, pois o acesso concorrente a um único buffer raramente faz sentido. A sincronização só previne que o método append() não seja chamada por duas threads simultâneas, porém, ela não garante nada sobre o que acontece entre duas chamadas ao método append. Por exemplo, se o código
strBuf.append("1").append("2");
For executado por duas threads diferentes a saída poderá ser 1212 ou poderá ser 1122.
A solução para isso é sincronizar a classe que contém o StringBuffer, mas nesse caso, a sincronização do buffer em si torna-se desnecessário, e podemos substitui-lo por um stringBuilder.
A concatenação de Strings realmente é mais rápida com essas classes. Ela só não é mais rápida em casos assim:
Que o java irá substituir invariavelmente por:
Mas, realmente, dentro de um while o tempo é incomparavelmente menor, como você mesmo demonstrou.
Não troquei as bolas não.
Evitar o acesso concorrente para concatenação no objeto é a mesma coisa que evitar a concatenação ao objeto de duas ou mais Threads ( ao mesmo tempo! esqueci de escrever isso... )
This message was edited 1 time. Last update was at 13/03/2009 07:57:44
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/03/2009 07:59:42
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
ViniGodoy wrote:Outra coisa que eu notei...
Já que você está usando o StringBuilder, não use a contatenação dentro do método append, foi feito na linha 7 do programa:
Dessa forma, você pode voltar a incorrer nos custos que queria evitar. No lugar, use o método append do próprio StringBuilder. Uma característica interessante é que esse método retorna o próprio StringBuilder, o que permite-nos chamar em cadeia:
Melhor que isso, só se a Sun tivesse escolhido a palavra add no lugar de append...
Com certeza, eu até iria fazer isso, mas daí ficaria diferente do programa anterior, pois eu queria adicionar strings propriamente dito.
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/03/2009 08:03:45
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline
|
Ué, se não trocou as bolas, porque seu código está com o StringBuffer, e não o StringBuilder, quando a documentação diz que é justamente o contrário que se deve fazer?
Sua explicação está trocada sim cara. Leia o Javadoc.
|
@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) 13/03/2009 08:36:18
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
ViniGodoy wrote:Ué, se não trocou as bolas, porque seu código está com o StringBuffer, e não o StringBuilder, quando a documentação diz que é justamente o contrário que se deve fazer?
Sua explicação está trocada sim cara. Leia o Javadoc.
Viajei total! hauehuaehuea
É verdade, troquei as bolas...
Se bem que quem nomeou essas classes poderia colocar algo mais sugestivo...
Valeu!
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
|
|