[quote=Felipe Kan]Que Java é mais lento que C/C++ todo mundo sabe… mas sempre vai aparecer gente falando o contrário…
Também como é que uma linguagem que gerencia memória através de um GC vai querer comparar com outra que não usa… e ainda por cima precisa de uma VM para interpretar os bytecodes…
[/quote]
Pelo visto você está por fora de alguns anos de evolução da VM e do Java. A VM não interpreta byte-codes. Ela compila. Mas não compila todo o bytecode, e sim, somente os trechos mais usados o que é chamado de Hotspot Compilation.
A Hotspot compilation tem algumas vantagens sobre a compilação feita no C++. Em primeiro lugar, ela pode identificar sobre qual hardware ela está compilando, e ativar otimizações específicas. Em segundo, ela conta com informações de runtime e pode, por exemplo, eliminar sincronização quando percebe que apenas uma thread está rodando, ou fazer inlining de métodos abstratos, coisa que o C++ não faz.
Quanto a gerência de memória, a do Java é centenas de vezes mais eficiente do que o new e delete do C++. Primeiro, porque a VM aloca grandes blocos de memória. Depois, porque ela trabalha com gerações de objetos, não desalocando memória que será rapidamente realocada. Uma experiencia interessante é colocar um código com muitos new e delete num loop, e fazer o mesmo em java. Você vai ver que no Java a performance é centenas de vezes superior. Por outro lado, o Java consome mais memória, já que não tem a filosofia de “você só paga pelo que usar”, que o C++ tem. A desalocação do garbage collection também ocorre em blocos grandes de memória, e alocar e desalocar memória é uma das tarefas mais custosas da maior parte dos sistemas.
Então, é difícil afirmar pura e simplesmente que o java é “mais lento” que o C++. Se você fizer algum programa envolvendo um calculo puramente matemático, é bem provável que na maior parte das vezes o Java realmente seja. Afinal, nele ocorrem poucas alocações de memória, e você provavelmente compilará os dois programas no seu computador, com as otimizações específicas ligadas.
Agora, num contexto mais amplo, duvido muito. Sem falar que o Java tem ferramentas de profiling maravilhosas, como o Visual VM, que permitem que você identifique e corrija os gargalos certos na sua aplicação. Enquanto para o C++ sobra o que? O Valgrind, que só roda em Linux?
Ok, não estou afirmando também que o Java seja mais rápido que o C++ sempre. Não é tão simples assim, porque performance muda de programa para programa. O que quero dizer é que, a menos que você programe firmware, os gargalos dificilmente estarão na linguagem. Aliás, acho muitissíssimo improvável hoje que eles sequer cheguem perto de estar, não é à toa que temos aplicações eficientes rodando em linguagens notoriamente lentas, como PHP.