Preb Fraco desempenho de Java em processadores de 2 Núcleos

15 respostas
F

Olá amigos, estou com um problema aqui, fiz uma aplicação que roda vários for e manipula vários números, e cada vez que faço isso, demora bastante.
Meu processador é um Core2Duo, equanto a aplicação está rodando, vejo que não força em nada o processador(atravez das ferramentas utilitárias do SO)…

Sei que a JVM limita o tamanho da memória a ser utilizada durante a execução de bytecodes, e até tenho um código que aumenta a utilização de memória da jvm que tem que ser adicionado ao arquivo de manifesto.

MAS O QUE EU QUERO MESMO É AUMENTAR O PROCESSAMENTO DURANTE A EXUÇÃO DESTE SOFTWARE, POIS O PROCESSADOR NÃO CHEGA NEM A 10% DE SUA CAPACIDADE ENQUANTO O SOTWARE RODA…

“Lembrando que este processamento não dá pra separar em threads no código.”

tem algum comando que se coloque no manifesto ou alguma configuração da jvm que pode aumentar a ocupação da minha aplicação no processador?

15 Respostas

E

Tem. Compre um disco mais rápido, ou melhore seu servidor de banco de dados. Se ele está usando 10% da CPU, provavelmente está demorando por outra coisa, não CPU.

F

amigo, não tem tem banco de dados, é um software cientifico e bem pequeno, não faz swap no hd hora nenhuma e nem tortura a memória carregando ela, é simples e puro processamento, que de alguma forma nao está ocupando os dois núcleos…

Realmente acho que a JVM não está deixando o software ocupar mais “espaço” no processador!
Me ajudem!

E

Você consegue usar pelo 100% de uma CPU no seu processamento (ou seja, 50% da sua máquina)?
O Java, como você deve saber, não paraleliza automaticamente operações matemáticas (ele não é um compilador Fortran com OpenMP, por exemplo).

F

Nada, executo o sistema, ele fica quase um minuto processando e durante este processamento, nem a 10% o processador nao chega.

F

já quando mando executar outras aplicação que não são em java mas exigem processador, ele chega a 90% rapidinho!

rogelgarcia

Como tá seu código??

Tem algum synchronized nele?

Voce está utilizando alguma função de parsing ou formataçao nesse algoritmo?

Tem como postar aqui pra gente ver?

F

amigo, nada de sincronized, alguns for while e manipulação de vetores de double “double[]”
já havia notado que isso acontecia, quando tinha que testar em outro software meu que eu tinha que treinar uma rede neural, demorava horas e o processador ficava livrissino…
para redes neurais eu usava o pacote joone.

rbcunha

fpaimlima:
amigo, não tem tem banco de dados, é um software cientifico e bem pequeno, não faz swap no hd hora nenhuma e nem tortura a memória carregando ela, é simples e puro processamento, que de alguma forma nao está ocupando os dois núcleos…
Me ajudem!

Se seu procedimento esta em uma única thread não irá ocupar os dois núcleos mesmo.
Para utilizar dois ou mais núcleos você tem que paralelizar seu processamento com uso de Threads.

A sim… se a aplicação é como você disse deveria estar ocupando 50% de processamento da máquina.

Tem algum Thread.sleep(), ou Thread.yield() no meio do código?

F

O fera, infelizmente tb não é assim, a porcentagem maior de processamento que registrei durante a execução do sistema foi 12%, nem cheguei perto dos 50%.
E também não, não coloquei nenhuma interrupção dentro do código Thread.sleep ou Thread. qualquer coisa.

L

fpaimlima:
Olá amigos, estou com um problema aqui, fiz uma aplicação que roda vários for e manipula vários números, e cada vez que faço isso, demora bastante.
Meu processador é um Core2Duo, equanto a aplicação está rodando, vejo que não força em nada o processador(atravez das ferramentas utilitárias do SO)…

Sei que a JVM limita o tamanho da memória a ser utilizada durante a execução de bytecodes, e até tenho um código que aumenta a utilização de memória da jvm que tem que ser adicionado ao arquivo de manifesto.

MAS O QUE EU QUERO MESMO É AUMENTAR O PROCESSAMENTO DURANTE A EXUÇÃO DESTE SOFTWARE, POIS O PROCESSADOR NÃO CHEGA NEM A 10% DE SUA CAPACIDADE ENQUANTO O SOTWARE RODA…

“Lembrando que este processamento não dá pra separar em threads no código.”

tem algum comando que se coloque no manifesto ou alguma configuração da jvm que pode aumentar a ocupação da minha aplicação no processador?

Se você tem um for e não fez nenhum uso de threads, o processador vai fazer sequencialmente cada iteração do for, ou seja, só vai pra próxima quando terminar a primeira, então isso realmente não vai fazer nem cocega no processador. Vc precisa usar recursos de abrir threads para executar o processo dentro do for, assim ele vai passar por cada iteração rapidinho só delegando para uma thread, dai provavelmente seu processador vai esquentar! :slight_smile:

Espero ter ajudado.

rogelgarcia

lavh:
Se você tem um for e não fez nenhum uso de threads, o processador vai fazer sequencialmente cada iteração do for, ou seja, só vai pra próxima quando terminar a primeira, então isso realmente não vai fazer nem cocega no processador. Vc precisa usar recursos de abrir threads para executar o processo dentro do for, assim ele vai passar por cada iteração rapidinho só delegando para uma thread, dai provavelmente seu processador vai esquentar!

Espero ter ajudado.

O processador vai passar para a proxima iteraçao, quando uma terminar… mas ele não deve ficar esperando… enquanto tá numa iteraçao… ele tem que calcular… entao o processador tem que moer mesmo…
Mesmo se vc só fizer um loop… pra nao calcular nada… o processador tem que moer…

Nao precisa criar thread pra isso nao… só se quiser distribuir nos dois nucleos…

rogelgarcia

Você tá usando algum profiler, tipo YourKit para monitorar a aplicação?

L

rogelgarcia:
lavh:
Se você tem um for e não fez nenhum uso de threads, o processador vai fazer sequencialmente cada iteração do for, ou seja, só vai pra próxima quando terminar a primeira, então isso realmente não vai fazer nem cocega no processador. Vc precisa usar recursos de abrir threads para executar o processo dentro do for, assim ele vai passar por cada iteração rapidinho só delegando para uma thread, dai provavelmente seu processador vai esquentar!

Espero ter ajudado.

O processador vai passar para a proxima iteraçao, quando uma terminar… mas ele não deve ficar esperando… enquanto tá numa iteraçao… ele tem que calcular… entao o processador tem que moer mesmo…
Mesmo se vc só fizer um loop… pra nao calcular nada… o processador tem que moer…

Nao precisa criar thread pra isso nao… só se quiser distribuir nos dois nucleos…

Então, eu concordo com o que você disse, porém, ainda acho que isso depende do que tem dentro do for. Se dentro tiver um código que não faz uso intensivo do processador, ele não vai moer.

Pq como você disse, se um for sem nada dentro faz o processador moer, então se o processador dele não está moendo é pq tem algo errado no código dentro do for.

rogelgarcia

Correto… o estranho é que, como ele diz, tem cálculo dentro do for… entao… era pra moer o processador…

O processador só teria que esperar se tivesse código sincronizado… Thread.sleep… wait… essas coisas…

barenko

Bem estranho.

Uma dica q vc pode usar é diminuir o escopo do seu programa até achar o ponto que impede o uso total do processador.

Tipo, vc pode rodar um código super simples como esse:

double j = 0; for (double i = 0; i < 10000000000d; i++) { j += i; // System.out.format(j + "\n"); }
Só para ver se sua VM chega nos 50% (eu testei em windowsxp com jdk1.5.0_22 e jre 1.6.0_17 e chegou em 50% facilmente).

Se chegar em 50%, então vc poderia clonar seu projeto e canibalizar trechos de código e testar, até que ele fique nos 50%, e então vc saberá exatamente qual é o trecho q evita o uso total da cpu.

Criado 3 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 15
Participantes 6