| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 14:40:23
|
Thiagosc
GUJ Master
Membro desde: 27/04/2006 21:01:27
Mensagens: 1134
Offline
|
Alguém tem uma idéia da performance de Java comparado a código nativo em relação a cálculos com ints e floats?
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 14:47:46
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
A resposta, é claro, é "depende".
Há algoritmos que dependem mais do acesso à memória que propriamente da velocidade das operações aritméticas (tanto em ponto fixo quanto em ponto flutuante). Como o ViniGodoy havia dito antes, pode haver alguns problemas de "caching" que podem dar resultados muito diferentes para o mesmo algoritmo (em linhas básicas), só por causa de alguns detalhes.
As versões novas do Java podem usar automaticamente instruções SSE2/SSE3/SSE4.x para acelerar o acesso a ponto flutuante; em C, talvez você tivesse que setar algumas opções de compilação, e também usar alguns métodos "intrínsecos" do compilador para que as instruções especiais sejam acessadas diretamente.
Obviamente há aqueles algoritmos que foram extremamente otimizados em C e que provavelmente nunca irão rodar tão rápido em Java, até por efeito de todas essas otimizações que podem ser feitas em C e que não sejam automáticas do Java.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 14:51:26
|
marcobiscaro2112
JWizard
Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline
|
Realmente depende.
Note que a essas operações geram somente uma ou duas instruções de bytecode em Java, o que indica que não deve haver perda significativa de desempenho se comparado com C, por exemplo.
Isso sem contar que, em trechos que são executados frequentemente, o compilador JTI pode dar uma força.
Mas, novamente, cada caso é um caso. Talvez a melhor coisa a fazer seja realizar testes com um trecho dos cálculos que você pretende fazer em ambas as linguagens e verificar as diferenças.
|
Marco Biscaro.
Seja livre!
Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?
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) 22/02/2010 15:05:31
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline
|
Quanto a operações com tipos de dados primitivos( int, long, short), não há nenhuma perda de performance. O JIT compila o bytecode para código nativo. A perda de performance ocorre quando existe lixo de memória, e o coletor de lixo começa a atuar. Fora o coletor, não existe nada que possa "atrapalhar" a execução de um programa na jvm, e da jvm para o processador(JIT). Dá uma olhada nesse tópico. O sergio postou um benchmark nele. http://www.guj.com.br/posts/list/90/198295.java
This message was edited 1 time. Last update was at 22/02/2010 15:07:28
|
www.citrox.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 15:19:22
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
A vantagem de você usar C++ nesses casos, é que você poderia baixar um compilador específico para o hardware que você irá rodar sua aplicação. Estou assumindo que trata-se de uma aplicação essencialmente matemática, e que você terá controle sobre o ambiente que ela será executada. Há exemplos de compiladores como esses aqui: http://software.intel.com/en-us/intel-compilers/ http://developer.amd.com/cpu/gnu/gcc412/Pages/default.aspx Nesse caso, haverá alguns níveis de otimização realmente agressivos para certos tipos de operações. E claro, o código gerado será realmente nativo. Uma covardia comparar com Java, que tem propósito de ser multiplataforma, e que tem como plataforma final o SO, não o processador.
This message was edited 2 times. Last update was at 22/02/2010 15:23:35
|
@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) 22/02/2010 16:04:50
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Só para terem uma idéia do tipo de otimização que é feita pelo compilador da Intel, basta ver o trabalhão que o Andy Polyakov teve ao tentar criar uma versão otimizada, em Assembly de X64, para algumas rotinas do OpenSSL. O Andy simplesmente pegou o código original compilado pelo icc (compilador da Intel) e tentou ver o que era possível melhorar. Ele gastou um tempo considerável até conseguir algo que fosse só um pouco melhor que o gerado pelo compilador.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 16:27:38
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Para alguns firmwares tínhamos também um "manual de boas práticas" para o compilador. Víamos em quais instruções similares um código mais eficiente era gerado, e davamos preferência a essas instruções (por exemplo, era melhor usar cadeias de if, ou um switch?).
Em compiladores bem-feitos, como o da Intel, esse manual era praticamente vazio.
|
@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) 22/02/2010 17:08:05
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline
|
ViniGodoy wrote:Para alguns firmwares tínhamos também um "manual de boas práticas" para o compilador. Víamos em quais instruções similares um código mais eficiente era gerado, e davamos preferência a essas instruções (por exemplo, era melhor usar cadeias de if, ou um switch?). Em compiladores bem-feitos, como o da Intel, esse manual era praticamente vazio.
Esse compilador é tão bom que até a ms usa para desenvolver os wins. Ela usa o intel e repassa o msc++ pra gente.... hehe Agora tem uma coisa interessante. Já tentaram fazer um benchmark de um programa que conta até 100000, usando gcc em unix e win32(mingw). A diferença é enorme.
This message was edited 1 time. Last update was at 22/02/2010 17:09:59
|
www.citrox.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 18:17:24
|
GradeBook
JavaChild
Membro desde: 08/07/2009 15:27:10
Mensagens: 142
Offline
|
Só para terem uma idéia do tipo de otimização que é feita pelo compilador da Intel, basta ver o trabalhão que o Andy Polyakov teve ao tentar criar uma versão otimizada, em Assembly de X64, para algumas rotinas do OpenSSL.
Um tempo atrás eu encontrei isso aqui sobre o OpenSSL: http://www.peereboom.us/assl/html/openssl.html
|
|
|
 |
|
|