[quote=sergiotaborda][quote=juliocbq][quote=sergiotaborda][quote=juliocbq]
Concordo que ter uma máquina gerenciando seu programa é uma coisa muito boa, mas não tem como um bytecode correr mais rápido que um assembly nativo, por razões físicas. A vm precisa conversar com o processador real de qualquer forma.
[/quote]
Então como vc explica os resultados do benchmark que linkei antes ?
Veja que o gargalo não é o processador ou sequer as instruções. O gargalo é a linkagem. Porque a do C++ é estática ele tem como saber sobre o ambiente em runtime. Ele não pode otimizar para runtime. Não é adaptativo. A VM permite esta adapatabilidade. E é isso que dá velocidade, não o processador.
A VM precisa comunicar com o processador, verdade, mas não sempre da mesma forma. É nessa adaptação que se ganha a velocidade.
Se vc corre um sistema durante um minuto, uma hora ou um ano em C++ tanto faz. Mas em java, a jvm vai aprendendo e se ajustando. Depois de um tempo ela já compilou a maior parte do codigo. Agora é assembly contra assembly. A diferença é a que a JVM produziu o melhor assembly possivel para o seu ambiente (OS, Processador, Memoria, padrões de uso do sistema) o do C++ é sempre o mesmo, não necessariamente o melhor.
Mesmo considerando compilações espeficias para uma plataforma o C++ perde. Porque mesmo assim ele não está usando estatisticas para saber que mais otimizações pode fazer.[/quote]
Você olhou o código fonte desse benchmark?
[/quote]
Eu não. Você olhou ? Olhe lá dentro e diga o que está errado. Embora isso não importe para o argumento aqui…
Mais resultados aqui
Você não está entendendo o ponto da questão. Existem mais coisas no ambiente do que simplesmente comunicar com o processador. O Vini já falou da alocação da memoria e eu dei o exemplo do padrão de uso. Java é mais burucrático que C por , por exemplo, sempre verificar os imites dos arrays a cada acesso. Mas estas restrições da especificação se aplicam cada vez menos na prática devido a uma inteligência que existe na jvm que não é nada trivial. E depois, como disse antes, nem todas as jvm são iguais.A da ibm é sempre pior, por exemplo. Portanto dizer que Java (sem mais qualificativos) é mais lento que C++ não tem qualquer significado.[/quote]
Olhei, compilei e testei.
Como não? Usei a mesma máquina virtual , e o mesmo código fonte do bench que você postou.
As razões do java ser mais lento são físicas. Existe um nível a mais entre o processador real e seu bytecode.
Logo na execução do aplicativo, o bytecode já está perdendo para o nativo, que já é instrução de microprocessador real.
E posteriormente vai perder por causa do coletor de lixo, mesmo com a aplicação compilada pelo jit.
Eu posso pegar todos os fontes postados naquele benchmark e contestá-los, mas são muitos e eu perco o dia de trabalho.
Porque você mesmo não pega um dos exemplos e faz os testes, ligando o otimizador do compilador c++? Vai ver que os resultados são diferentes.