[RESOLVIDO]Java é linguagem de baixo nível?

[quote=juliocbq]Essa otimização é relevante somente em pequenos algoritmos. Com o aumento da complexidade dos objetos o Java tende a perder desempenho porque todos os métodos e variáveis São declarados como virtuais e tudo acaba sendo alocado no heap. Isso gera um consumo de memória grande e consequente perda de desempenho no processamento. Existe um artigo interessante na wiki sobre isso.

http://en.m.wikipedia.org/wiki/Comparison_of_Java_and_C++[/quote]

Um dos graves problemas do Java é mesmo o consumo de memória. Muitas estratégias dele para ganhar performance envolvem caches.
Outro problema é o fato do garbage collector literalmente congelar a aplicação por alguns milissegundos, enquanto trabalha.

Agora, eu discordo com vc de que essas otimizações sejam válidas só em pequenos algorítimos. Não é incomum ver programadores C++ que usam o new e delete default, e isso gera um penaulty grave para performance. Você até pode contornar em alguns casos, mas em outros, pode ser que o código problemático esteja encapsulado numa biblioteca, e você só descubra tarde demais, ou esteja impossibilitado de substituí-la. Também é bastante fácil ser descuidado com I/O ao usar o fstream, sem se preocupar em você mesmo criar um cache (no java, qualquer programador jr. sabe criar seu BufferedInputStream).

Por isso costumo dizer que o C++ é mais otimizável que o Java, mas não necessariamente mais otimizado. O fato é que, se duas equipes gastarem esforços, um programa C++ certamente será algumas vezes mais rápido que um programa Java. Porém, o esforço para isso no C++ é gigantesco, exige um time experiente, horas de desenvolvimento e benchmarking e, portanto, tem um custo muito alto. Erros no C++ também podem ter um impacto muito mais sobre o desempenho. Vai ter sentido apenas em empresas que trabalham com tempo real: vídeo, jogos, etc.

Outro ponto positivo do Java, em termos de construir aplicações com performance, são os profilers. O fato de ter muita informação de contexto (graças ao reflection) e de ter a VM, permite que profilers excelentes sejam criados. E o melhor, profilers não intrusivos, que não exigem qualquer modificação em seu código. Nós mesmos somos bastante fãs do Visual VM e do profiler do Netbeans, ambos fornecidos de graça. E nem adianta falar do Valgrind. Ele é só para Linux e nem se compara a um profiler Java.

Agora vem o detalhe mais importante dessa discussão: Essa diferença de performance gera impacto perceptível na aplicação? Porque não adianta nada falarmos de performance da linguagem, se isso não for percebido pelo usuário. Em 90% dos casos, não. Só valerá a pena se preocupar com a linguagem em si, caso você trabalhe com sistemas de tempo real, críticos. Audio, vídeo, games, sistemas industriais, são exemplos de sistema assim. Ou seja, sistemas que são intensamente CPU Bound, que dependam muito de processamento puro e simples, e não irão perder tempo em I/O, rede, etc.

Para um servidor de rede você tem um gargalo gigante, que é a própria rede em si. Para uma aplicação comercial, os gargalos geralmente irão se concentrar no BD. Até por isso o PHP, que é uma linguagem extremamente lenta, tem aplicações ótimas e rápidas, como o Wordpress, simplesmente porque não adianta falar de performance, se não estivermos falando em otimização de gargalos. O fato é que a linguagem dificilmente será o gargalo, e tirando aplicações como as que eu e você desenvolvemos, acho que a maior parte do fórum jamais sequer terá a necessidade de migrar um código Java para um C++.

Vini realmente pode ser que o buraco seja mais embaixo mesmo e a resposta não seja tão determinística no sentido de apontar uma linguagem como tendo melhor performance.
Talvez tenhamos mesmo de levar em consideração a aplicação :

…While C++ is faster than Java in most cases,[10] there are several studies of mostly numerical benchmarks, which argue that Java could potentially outperform C++ in some circumstances,.[11][12][13][14] However, it is widely recognized that numerical (micro-)benchmarks are not appropriate for evaluation of languages; two compilers with different performance on non-numerical sections of code may still be able to optimize numerical sections equally.[15][16][17] If referring to a real world program, Java would suffer because of a number of reasons:[18][19][20]…

http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B

O que voce disse pode resmir muito : Que na prática se levarmos a relação custo-benefício de um modo geral o Java pode ser uma melhor opção para 90% dos casos.

+++

Nossa, vocês viram as referências deles? As de Java, vem de faculdades, revistas e estudos aparentemente sérios.
As do C++, vem de sites pessoais, inclusive “why I hate java”. Tinham que melhorar isso aí.
Há referências sérias mostrando que C++ tem performance melhor também.

O fato é que todo benchmark que for CPU-bound irá favorecer o C++. E todo benchmark que mostrar alocação e desalocação no heap irá favorecer o Java.

E, claro, tudo depende do quão elaborado será o programa C++, do quanto vc investe nele. Como eu falei, se você se dedicar, você sempre conseguirá fazer um programa C++ mais rápido que um programa Java. E isso normalmente irá envolver olhar com muito cuidado como se aloca e desaloca memória (seja escrevendo um alocador próprio, ou mudando código do heap para o stack).

Mas a diferença só será significativa para o usuário se o programa for muito orientado a CPU.
Sistemas de tempo real, aplicações de processamento de dados (meteorologia, bolsa de valores), simulações matemáticas, etc…

Em aplicações comerciais normais, raramente a diferença de performance vai valer o sacrifício de ter novamente problemas com memory leaks e dangling pointers. Outros fatores, como ter ou não uma VM instalada, podem ter um peso muito mais significativo na escolha entre uma ou outra linguagem.

Nesse ponto eu concordo com o viny, na faculdade alguns colegas vivem criticando o java, apontando problemas e dificuldades de desenvolvimento por conta das configurações de variáveis de ambiente, tomcat, frameworks, mas tudo isso depende do programador, eu mesmo nunca tive tais problemas, agora pega um zé do PHP(sem querer desmerecer) e vem pro java achando que pode colocar array dentro de string, inteiro dentro de string, char dentro de string e por aí vai… java é uma linguagem fortemente tipada e é assim por ser segura, mas eles vivem falando “o que vc faz em 5 linhas no java eu faço em 2 no PHP”…

Essa questão de desempenho está muito mais relacionada ao desenho da aplicação e aos algoritmos utilizados que na questão física propriamente dita.
Esses problemas no java eu citei porque até hoje não entendo como não foram corrigidos. A CLR é bem mais otimizada nesse sentido de consumo porque não aloca tudo na memória. Já era hora da Oracle pensar nisso porque realmente é um empecilho grande usar aplicações desktop que geralmente ocupam umas centenas de Mb e muitos até Gb.

O custo benefício do java é grande? Claro que é, mas o desenho da jvm ainda pode e deve melhorar muito na minha opinião.