"Java não tem performace"

Se brincar o C++ tem mais APIs do que o Java! Você pode começar por essa aqui:
http://www.boost.org/doc/libs

Só na boost tem API para absolutamente tudo o que você citou. E é free.

Eu concordo com o Entaglement. Um nullpointer em java gera um stacktrace com a exata linha de onde deu o problema. No C++, gera um General Protection Fault…
O mais difícil no C++ na minha opinião é mesmo a gerência de recursos, inclusive memória. Um leak de poucos bytes pode levar dias de desenvolvimento para ser encontrado. Sem falar que o C++ é praticamente um campo minado, cheio de pequenos detalhes de implementação que podem causar enormes dores de cabeça se negligenciados…

[quote=evandro.santos][quote=Rubem Azenha][quote=evandro.santos]
Acredite que a maioria dos programadores C++ fariam um código de gerencia de memória pior do que está disponível no GC do Java.

Imagine a seguinte aplicação: 7000 usuário simultâneos, média de 25 transações por segundo (picos de 60 transações por segundo), banco de dados… Construir isso não seria simples (C++), deveria ter um servidor para reutilizar conexões, Cache, conexão entre o desktop e o server, controle de transações, etc.

Fica a seguinte pergunta: Em duas equipes, uma C++ e outra em Java, quem faria o software com a melhor performance?
[/quote]

Se a equipe de C++ souber o que esta fazendo, o software deles tera mais performance. Se a equipe de Java souber o que esta fazendo, o software deles tera mais performance.
A menos que você esteja fazendo algo que cada milisegundo de uma única operação é relevante (controle de um reator numa usina nuclear) ou uma aplicação 100% desktop, eu não acho que teria tanta diferença assim.[/quote]

Mesmo uma equipe que saiba muito o que está fazendo (que por sinal seria muito mais cara do que a equipe de Java) C++ tem o problema de não possuir uma grande variedades de frameworks e APIs disponíveis (a um preço que não comprometa o projeto), imagine o tempo de implementar: classes para fazer Cache, Pool de conexões, controle de transação, um protocolo de comunicação (sockets é dureza), etc. Implementar isso tudo exige muito conhecimento e um bom tempo.[/quote]

Não ia ser não. Existem muitos frameworks bons ae, e são opensource.

www.wxwidgets.org
http://qt.nokia.com/

É lógico que com um framework como hibernate as tarefas de se construir uma aplicação robusta são reduzidas ao mínimo, mas em termos de performance realmente não tem comparação com uma linguagem nativa, porque coleta de lixo automática toma muito processamento e memória.

[quote=entanglement][quote=evandro.santos]
Mesmo uma equipe que saiba muito o que está fazendo (que por sinal seria muito mais cara do que a equipe de Java) C++ tem o problema de não possuir uma grande variedades de frameworks e APIs disponíveis (a um preço que não comprometa o projeto), imagine o tempo de implementar: classes para fazer Cache, Pool de conexões, controle de transação, um protocolo de comunicação (sockets é dureza), etc. Implementar isso tudo exige muito conhecimento e um bom tempo.[/quote]
Hum… o problema principal em aplicações C++ não é a variedade de frameworks (ok, eu sei que um monte deles tem de ser adquirido em vez de ser open-source). O problema principal, a meu ver, é que é difícil detectar certos erros primários que costumam causar apenas stack traces em Java, mas provocam falhas fatais em C++. Isso atrasa sobremaneira o desenvolvimento.[/quote]

Se quiser gerenciamento de memória automática é só usar smart pointers da biblioteca padrão. É um coletor de lixo automático e super robusto:

auto_ptr<X> myX(new X());

Esse objeto é alocado e desalocado automáticamente, de acordo com o seu escopo.

Se brincar o C++ tem mais APIs do que o Java! Você pode começar por essa aqui:
http://www.boost.org/doc/libs

Só na boost tem API para absolutamente tudo o que você citou. E é free.

Eu concordo com o Entaglement. Um nullpointer em java gera um stacktrace com a exata linha de onde deu o problema. No C++, gera um General Protection Fault…
O mais difícil no C++ na minha opinião é mesmo a gerência de recursos, inclusive memória. Um leak de poucos bytes pode levar dias de desenvolvimento para ser encontrado. Sem falar que o C++ é praticamente um campo minado, cheio de pequenos detalhes de implementação que podem causar enormes dores de cabeça se negligenciados…[/quote]

É sim, mas esses leaks podem ser evitados com os smart pointers, como citados acima.
Ao meu ver a vantagem do java é a simplicidade. É mais fácil de desenvolver e resolve os seus problemas, quando o coletor de lixo não faz a diferença, claro.

A grande vantagem de todas as linguagens com VM , não apenas o java, é que existe sempre a opção de recompilar. Isto é simplesmente impossivel em linguagens como C++. C++ é uma linguagem, java é uma plataforma. São mundos diferentes. Comparar os dois não é honesto.

O JVM da Sun é uma das VM mais evoluidas, senão a VM mais evoluida. Isto porque existe empenho acadêmico em torná-la sempre melhor.
O problema da JVM é que existem duas JVM , a server e a client. Tradiconalmente a server sempre foi mais rápida e é mais rápida que C++, enquanto a cliente é mais lenta. (http://kano.net/javabench/data). Isto vai mudar na JVM 7 em que muitas das otimizações da jvm server irão passar para a jvm client.

Muitas evoluções acontece de forma muito inteligente , como por exemplo remover os monitores de concorrencia ou eliminar a verificação de limites de arrays que faz parte da especificação. Isto sem mexer na linguagem ou fazer o programador usar outro tipo de objeto ou artefato.

Dizer que java é mais rápido que C++ não tem significado. É preciso dizer qual JVM contra qual processador. Já que nem todas as JVM são igualmente rápidas e nem todo o C++ corre com a mesma velocidade. A JVM pode compilar codigo e recompilar sempre que achar necessário. Ela acumula estatisticas e outras informações ( a maior parte as mesmas que são transmitidas via o protocolo de profiling) que permitem tomar decisões sobre o quê compilar, quando e como. E depois de compilado ainda ha a opção de apagar e começar de novo. Isto não existe em C++ simplesmente porque não ha uma VM para C. Aliás esse é o objetivo do C: controlar a máquina real. Mas existem muitas máquinas reais, portanto as otimizações são limitadas.

Um outro problema é que, mesmo quando o C++ é mais rápido - por exemplo em calculos de matrizes, ele é menos exato. Não ha garantia que um calculo feito em C++ em máquinas diferentes terá o mesmo resultado. Isto é normalmente esquecido. Quando se diz que C não é portável não significa apenas que não roda em máquinas diferentes, significa que tem resultados diferentes em máquinas diferentes. Em java isto também acontece, mas a JVM dá garantias. Java implementa o padrão IEEE para numeros de ponto flutuante e dá garantias de ulp. Estes erros, em cadeias grandes de calculos, podem provocar diferenças obseráveis nos resultados.
Enfim, velocidade é inutil se o resultado não é reprodutivel.

Mesmo que o Java não tenha melhor velocidade hoje, com certeza terá melhor amanhã. O fato é real. A velocidade das JVM desde 1.0 até hoje vem aumentando. Em certo ponto ela irá ultrapassar a velocidade do C, C++ e outras linguagens estaticamente compiladas. Hoje estamos chegando perto disso. Muito perto…

P.S. embora não existe uma VM , per se, em C++ existem VM que correm a partir de codigo C++ tentando trazer para o ambiente estático algum dinamismo. http://llvm.org/. Isto significa que o uso de VM passa a ser obrigatório daqui para a frente ( dos anos 90 para frente, na realidade, mas só agora temos provas disso). E a performance, e outras qualidade de runtime passam a depender de algoritmos evoluidas das VM e não de “espertezas” dos programadores. Não é por acaso que todo o mundo quer ter sua linguagem sobre a JVM e até sobre a VM do .NET. Afinal fazer VM é dificil e altamente académico.

Onde trabalho nós temos tabelas enormes que levam em média uns 10 segundos para fazer um select simples. No Delphi não existe um framework tipo o hibernate para controlar esse acesso em memória. Nem um TClientDataSet é usado para armazenar uma consulta para não precisar fazer acesso toda hora no banco, isso eles não vêem. Conversando com meu diretor ele me disse que quando fizeram o projeto em Java aqui, ele era web e não havia um servidor descente na época, isso foram as palavras dele, agora servidor descente eu não sei o que ele quis dizer com isso.

Resumindo, acho que os programadores ruins de Java não economizam nos objetos e nem se preocupam com o reuso de software, não utilizam os conceitos de O.O. e depois jogam a culpa no Java.

Dêem uma olhada em C# e no Java, são praticamente iguais:
JVM -> .Net
Java -> C#

Ambos com uma sintaxe parecidíssima e utilizam as mesmas metodologias para desenvolver.

Java para Desktop somente é lento se for mal programado. Se for uma aplicação com threads trabalhando juntas fica super rápido.

Isso eu digo porque desenvolvo em java para desktop já há um bom tempo e as possibilidades de customização em java para desktop é fantástica.
Há possibilidade de vários look and feel, de poder mudar o reinderizador de todos os componentes deixa a linguaguem java ná minha opinião a melhor linguaguem para desenvolvimento desktop.

Claro, sem saber programar direito e sem conhecimento da linguaguem realmente fica difícil ganhar performance.

Nem li todas as respostas, mas essa briga é velha.

Não li inteiro mas sei que:

  • Java ser super pesado é um mito
  • O poder de Java depende do seu poder como programador e como designer do sistema[uso correto da OO interfere na performance, alguém duvida?]
  • Comparar Java com algo que só roda no windows é perda de tempo

[quote=sergiotaborda]A grande vantagem de todas as linguagens com VM , não apenas o java, é que existe sempre a opção de recompilar. Isto é simplesmente impossivel em linguagens como C++. C++ é uma linguagem, java é uma plataforma. São mundos diferentes. Comparar os dois não é honesto.

O JVM da Sun é uma das VM mais evoluidas, senão a VM mais evoluida. Isto porque existe empenho acadêmico em torná-la sempre melhor.
O problema da JVM é que existem duas JVM , a server e a client. Tradiconalmente a server sempre foi mais rápida e é mais rápida que C++, enquanto a cliente é mais lenta. (http://kano.net/javabench/data). Isto vai mudar na JVM 7 em que muitas das otimizações da jvm server irão passar para a jvm client.

Muitas evoluções acontece de forma muito inteligente , como por exemplo remover os monitores de concorrencia ou eliminar a verificação de limites de arrays que faz parte da especificação. Isto sem mexer na linguagem ou fazer o programador usar outro tipo de objeto ou artefato.

Dizer que java é mais rápido que C++ não tem significado. É preciso dizer qual JVM contra qual processador. Já que nem todas as JVM são igualmente rápidas e nem todo o C++ corre com a mesma velocidade. A JVM pode compilar codigo e recompilar sempre que achar necessário. Ela acumula estatisticas e outras informações ( a maior parte as mesmas que são transmitidas via o protocolo de profiling) que permitem tomar decisões sobre o quê compilar, quando e como. E depois de compilado ainda ha a opção de apagar e começar de novo. Isto não existe em C++ simplesmente porque não ha uma VM para C. Aliás esse é o objetivo do C: controlar a máquina real. Mas existem muitas máquinas reais, portanto as otimizações são limitadas.

Um outro problema é que, mesmo quando o C++ é mais rápido - por exemplo em calculos de matrizes, ele é menos exato. Não ha garantia que um calculo feito em C++ em máquinas diferentes terá o mesmo resultado. Isto é normalmente esquecido. Quando se diz que C não é portável não significa apenas que não roda em máquinas diferentes, significa que tem resultados diferentes em máquinas diferentes. Em java isto também acontece, mas a JVM dá garantias. Java implementa o padrão IEEE para numeros de ponto flutuante e dá garantias de ulp. Estes erros, em cadeias grandes de calculos, podem provocar diferenças obseráveis nos resultados.
Enfim, velocidade é inutil se o resultado não é reprodutivel.

Mesmo que o Java não tenha melhor velocidade hoje, com certeza terá melhor amanhã. O fato é real. A velocidade das JVM desde 1.0 até hoje vem aumentando. Em certo ponto ela irá ultrapassar a velocidade do C, C++ e outras linguagens estaticamente compiladas. Hoje estamos chegando perto disso. Muito perto…

P.S. embora não existe uma VM , per se, em C++ existem VM que correm a partir de codigo C++ tentando trazer para o ambiente estático algum dinamismo. http://llvm.org/. Isto significa que o uso de VM passa a ser obrigatório daqui para a frente ( dos anos 90 para frente, na realidade, mas só agora temos provas disso). E a performance, e outras qualidade de runtime passam a depender de algoritmos evoluidas das VM e não de “espertezas” dos programadores. Não é por acaso que todo o mundo quer ter sua linguagem sobre a JVM e até sobre a VM do .NET. Afinal fazer VM é dificil e altamente académico.

[/quote]

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.
O Jit hoje, compila o bytecode em assembly nativo, fazendo otimizações, e essa foi a grande evolução da jvm. Mas a vm pioneira disso foi a da microsoft, o .net.

Quando o bytecode ou il estiver correndo super rápido o e liso nos SOs, o assembly nativo vai estar a 1 passo afrente, justamente por ser nativo e não precisar de nenhum tipo de conversão, ou diálogo entre 2 processadores diferentes.

[quote=Jesuino Master]Nem li todas as respostas, mas essa briga é velha.

Não li inteiro mas sei que:

  • Java ser super pesado é um mito
  • O poder de Java depende do seu poder como programador e como designer do sistema[uso correto da OO interfere na performance, alguém duvida?]
  • Comparar Java com algo que só roda no windows é perda de tempo

    [/quote]

Pesado não é não, mas também não é rápido.

Vini, nunca fiz não posso afirmar com certeza, mas diziam dentro da BEA que com a JRockit Real Time, você conseguia especificar para o GC coletar de tanto em tanto tempo de forma linear.

Ah, ok. Mas nesse caso é uma característica de uma VM específica. No Java 7, haverá um GC com mais garantias também.
De qualquer forma, mesmo no caso do Rockit, ou do Java 7, é ainda muito difícil especificar com perfeita exatidão o que será coletado e como.

Ah, ok. Mas nesse caso é uma característica de uma VM específica. No Java 7, haverá um GC com mais garantias também.
De qualquer forma, mesmo no caso do Rockit, ou do Java 7, é ainda muito difícil especificar com perfeita exatidão o que será coletado e como.[/quote]

Que tipo de garantias será dada no GC do java 7?
Fiquei curioso agora! Pesquisando…

Ah, ok. Mas nesse caso é uma característica de uma VM específica. No Java 7, haverá um GC com mais garantias também.
De qualquer forma, mesmo no caso do Rockit, ou do Java 7, é ainda muito difícil especificar com perfeita exatidão o que será coletado e como.[/quote]

Que tipo de garantias será dada no GC do java 7?
Fiquei curioso agora! Pesquisando…[/quote]

O coletor vai ser inteligente, e se adapta a aplicação. Por exemplo, ele faz um profile da sua aplicação e calcula o tempo correto que deve rodar, dessa maneira diminuindo as pausas.

http://openjdk.java.net/projects/jdk7/features/#f230
http://tech.puredanger.com/2008/05/09/javaone-g1-garbage-collector

[quote=Tchello]Que tipo de garantias será dada no GC do java 7?
Fiquei curioso agora! Pesquisando…[/quote]

http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-5419&yr=2008&track=javase

O link realmente detalhado é esse aqui: http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf

Opa, muito obrigado!
Já estou lento os documentos sugeridos.

Realmente Java é fraco nesse ponto (isso porque ele é uma plataforma, não uma linguagem). Mas quase todo problema já tem uma solução que usa uma biblioteca nativa. E como o JNA vem crescendo bastante isso muitas vezes não se torna um problema.

Só para citar um exemplo, semana passada fiz um “port” da libnotify para Java com JNA usando apenas uma classe (com menos de 50 linhas) e absolutamente nada de linguagem nativa.

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.

BDP no Delphi também faz isso, e de forma mais transparente, além de gastar menos memória.

Mas, como disseram, tem muitas facilidades no Java que compensam a perda de performance e o maior uso de memória. O compilador Delphi é muito rápido e gera um código nativo bastante otimizado, o Java teria que ficar fazendo N análises pra conseguir chegar em um código comparável, mas sempre terá que contar com a máquina virtual.

Só que são poucas as situações que os décimos de segundo de diferença vão fazer falta no processamento, principalmente nas máquinas atuais, por isso acho que essa vantagem no Delphi só vale pra alguns casos (talvez seja o caso da pessoa que disse a frase tema do tópico).

Gosto de drag and drop. Economiza muito tempo em criar interface e aumenta a produtividade, mas na parte de regras de negócio não tem jeito: é codificar mesmo. E é aí que está o maior tempo de desenvolvimento de qualquer software de médio porte pra cima. Ainda existe muita facilidade do Delphi que o Netbeans e Eclipse não possuem, mas existe o inverso também.

Mas a maior vantagem que vejo no Java é a independência de plataforma.