"Java não tem performace"

149 respostas
M

O título do tópico foi a seguinte frase de um cara que me entrevistou numa empresa. Depois de ter gasto uma grana com uma equipe de desenvolvedores Java para um projeto que durou 6 meses e que não teve êxito o diretor de ti da empresa decidiu “matar” a equipe e voltaram para o desenvolvimento em Delphi.

Depois disso fiquei pensando, Java para desktop pode até ser pesado (acho) mas para web ele é tão bem cotado, existem vários sistemas de banco e do governo desenvolvidos em Java, eu particularmente ADORO Java.
Já percebi também que, aqueles que mais “chegam o reio” em outras linguagens são porque não tem muito conhecimento dela e sempre acabam puxando a sardinha pro seu lado.

Comparando C#.Net e Java são parecidíssimas!! Até as classes de conexão com banco são praticamente iguais e já me disseram que C#.Net abstraiu toda a funcionalidade boa de Java.

Por que esse povo que não sabe muito bem Java fala tão mal de Java?
Java para desktop é mesmo pesadão?
E para Web?

149 Respostas

G

Provavelmente nunca conseguiu aprender a programar (PROGRAMAR de verdade) em java.

Vide a primeira resposta.

Vide a primeira resposta.

Isso não é problema com o java, mas sim com a capacidade do programador. Se o cara for ruim, pode fazer de uma funcionalidade simples um monstro…

M

Para as maquinas de hoje, que tem no minimo 1gb de ram e outras coisas… java não é pesado.
mas se for usar uma maquina de 5 anos átras aí sim ele pode se tornar pessado…

A

Porque Java pra Desktop era ruim. Podem me ignorar ou falar que estou errado, mas antes era lento e não tem nada que me faça pensar o contrário. Me desculpem a grosseria, mas já vi muita gente comentando que não é lento, que é só saber programar direito, mas ainda assim não me convenci.
Hoje é um pouco diferente… Ocorreram algumas alterações no Java 6 Update 10 (se não me engano, e no 7 está para melhorar mais ainda) que melhoraram a performance, então é bem provável que as coisas comecem a melhorar pro lado do Swing. Mas assim… Acho que Delphi é bem produtivo também, as vezes até mais que Java quando se trata de botõezinhos e caixinhas e formulários pra sistemas Desktop.

Sobre o Java 7, não lembro direito onde que li isso, mas ele vai ser quase 50% mais rápido que o Java 6. O Java 6, quando comparado ao 5, foi um pouco menos que 20% mais rápido. Acho que de uns tempos pra cá as coisas podem melhorar pro Java pra Desktop, quando Swing é usado. Eu, particularmente, já vi uma boa melhora na velocidade de aplicações Swing.

Dá uma procurada por Java 7 Performance. Devem ter vários artigos bem interessantes sobre esse tipo de coisa.

M

E para Web de 0 a 10 Java se enquadra em que nível?

R

Alguém aqui vai desenvolver sistemas de tempo real se sim então JAVA é lento.

Vá estuda C mas C puro onde entra orientação a objeto já começa a fica lento.

Boa sorte com os controles de estoque em tempo real :smiley:

M

Pra desktop, tem existe o tempo de carregar a máquina virtual e mesmo as versões atuais consomem mais memória e são mais lentas que um aplicativo nativo, como o Delphi.

Pra Web a situação inverte, os aplicativos em Delphi são muito mais pesados e não tem a mesma performance, além dos programas ficarem grandes e gerarem muito tráfego de rede.

Mas mesmo pra desktop, existe o ganho de segurança e estabilidade que acredito compensarem o uso de Java. Uma aplicação em Java pode até demorar um pouco mais pra ser feita e precisar de um profissional com um pouco mais de conhecimento, mas em compensação é muito mais produtivo de dar manutenção. Dependendo da aplicação, isso faz toda a diferença.

E pra máquinas atuais, principalmente as que irão rodar esse tipo de aplicações, o processamento e memória dão e sobra. Se você tem 1 Gb de RAM e vai rodar só a sua aplicação de PDV, que diferença faz se o sistema vai precisar de 2 Mb ou de 12 Mb?

P

Provavelmente não era uma equipe com conhecimento suficiente ou não tinha um lider para alinhar as coisas.

O que eu quero dizer é que Delphi é mais produtivo porque você consegue fazer uma tela em instantes. Mas, por exemplo, se for um sistema grande que necessite de portabilidade e escalabilidade, talvez Delphi não seja a melhor opção. Já em outros casos, pode ser bacana. Tudo depende do que o usuário deseja e quanto preparada está sua equipe.

Já sobre performance, há muito tempo isso vem sendo discutido. Segundo alguns testes, por Java usar o JIT (http://pt.wikipedia.org/wiki/JIT), depois de um certo tempo de execução, a performance chega a ser muito próxima a C++. Ou seja, performance não pode ser usada como desculpa para não usar Java.

M

pozzo:

Já sobre performance, há muito tempo isso vem sendo discutido. Segundo alguns testes, por Java usar o JIT (http://pt.wikipedia.org/wiki/JIT), depois de um certo tempo de execução, a performance chega a ser muito próxima a C++.

O problema é você esperar esse “algum tempo de execução”. Pra rotinas repetitivas, esse argumento talvez seja válido, mas caso contrário tem perda de performance mesmo. Só que pras máquinas de hoje não faz tanta diferença sua máquina levar 2 segundos ou 3 segundos pra realizar a tarefa.

R

desisti de argumentar …

P

marcosalex:
pozzo:

Já sobre performance, há muito tempo isso vem sendo discutido. Segundo alguns testes, por Java usar o JIT (http://pt.wikipedia.org/wiki/JIT), depois de um certo tempo de execução, a performance chega a ser muito próxima a C++.

O problema é você esperar esse “algum tempo de execução”. Pra rotinas repetitivas, esse argumento talvez seja válido, mas caso contrário tem perda de performance mesmo. Só que pras máquinas de hoje não faz tanta diferença sua máquina levar 2 segundos ou 3 segundos pra realizar a tarefa.

Fala Marcos. Bom, pesquisando melhor, encontrei um post de um colega meu que testou o “certo tempo” que me referi, e parece ser bem mais curto do que pensei. Veja e me diga o que você acha sobre isso:

M

Esse exemplo é um caso de loop ou recursão, onde realmente o JIT ajuda. Mas em casos onde não há loop ou rotina chamada mais de uma vez, não há tanto ganho.

Daí vai pela média de repetições que cada programa tem.

R

marcosalex:
Esse exemplo é um caso de loop ou recursão, onde realmente o JIT ajuda. Mas em casos onde não há loop ou rotina chamada mais de uma vez, não há tanto ganho.

Daí vai pela média de repetições que cada programa tem.

Como ?

Então qual o teste que você sugere para performance ?

Não entendi mesmo.

[]`s

V

Eu já vi algumas aplicações C++ serem substituídas por aplicações Java, ambas de desktop. O Java tem boas ferramentas de profiling, coisa que você não encontra por aí em qualquer lugar. Agora, o que é performance para ele? Se for rodar em uma máquina muito tabajara, realmente, o Java é pior que o Delphi.

Os maiores problemas do Java, na minha opinião, ainda são o consumo de memória e o fato do Swing ser uma API pesada. Acho que ele seria pesado em qualquer lugar que fosse implementado, pois ele suporta múltiplos look&feel e faz a renderização de tudo usando a API de desenho do SO, não a API de componentes nativos. Por outro lado, ele é extremamente poderoso e personalizável, coisa que o Delphi não é.

R

Outra coisa que vale lembrar que o unico rival para o Java hj é o C#, que por sinal tem um framework para jogos sensacional o famoso XNA.

Claro tem o C e C++ mas dai o foco dessas linguagens é outro.

Com relação a Ruby, Python, Php e as demais, realmente elas não me agradam.

Comprei um livro de Rails mas acabei deixando ele de lado.

[]`s

L

Para desktop tempo real é realmente lento… quase inviável, dependendo da situação.

EX:
Há uns 3 anos, na faculdade, fiz um soft para fazer leituras de um ADC (Conversor analógico-digital) pela porta paralela em java desktop.
Úsei gráficos do jfreechart… um ‘velocímetro’ em tempo real, um estilo ‘eletrocardiograma’… o soft ficou muito bom…
porém na hora de fazer as capturas de amostra de sinal, havia uma distorção na frequência de captura e a amostra não prestava mais…
Coloquei em uma thread separada… o problema diminuiu, porém ainda continuou…

precisei fazer uma classe a parte, sem interface gráfica, chamando pelo prompt e gravando num arquivo…
depois de colhida a amostra eu abria o soft e analisava!!!

teoricamente, pelo menos em relação ao C++ , é 100% mais lenta…
visto que, enquanto o C conversa direto com a máquina, o java tem um intermediário: VM

M

Lá na empresa nós usávamos um messenger chamado Spark, o pessoal dizia que ele era feito em Java e que caía muito durante a conexão, sem contar que consumia muita memória. Essa afirmação é verdadeira ou é só mais uma desculpa pra por a culpa no Java?

H

lauronolasco:
Para tempo real é realmente lento… quase inviável, dependendo da situação.

EX:
Há uns 3 anos, na faculdade, fiz um soft para fazer leituras de um ADC (Conversor analógico-digital) pela porta paralela em java desktop.
Úsei gráficos do jfreechart… um ‘velocímetro’ em tempo real, um estilo ‘eletrocardiograma’… o soft ficou muito bom…
porém na hora de fazer as capturas de amostra de sinal, havia uma distorção na frequência de captura e a amostra não prestava mais…
Coloquei em uma thread separada… o problema diminuiu, porém ainda continuou…

precisei fazer uma classe a parte, sem interface gráfica, chamando pelo prompt e gravando num arquivo…
depois de colhida a amostra eu abria o soft e analisava!!!

teoricamente, pelo menos em relação ao C++ , é 100% mais lenta…
visto que, enquanto o C conversa direto com a máquina, o java tem um intermediário: VM

É facil fazer um software “nas coxa” e colocar a culpa no “JAVA”.

L

Hellmanss…

vc viu o código pra dizer que é “nas coxas”???
vc ja trabalhou com alguma tarefa de precisão em função do tempo com java???

em nenhum momento eu coloquei a culpa no java…
mas é inegável que pra trabalhar com desktop ele é mais lento…
dependendo do seu problema, essa diferença no tempo pode não influenciar o resultado final…
ou pode… como foi o meu caso!!!

G

Acho que a grande questão é avaliar o que estava causando a perda de desempenho.

Rede, acesso ao BD, algoritmos mal implementados, criação de objetos desnecessários… Se for feita uma avaliação é bem provável que o problema esteja fora da JVM.

Porém as vezes é mais fácil colocar a culpa no que não está sobre o nosso controle.

L

Guerr@…

novamente repito…
não estou colocando a culpa no java…
tanto é que consegui resolver o problema com o proprio java…

vcs ja trabalharam com ADC???

M

Guerr@:
Acho que a grande questão é avaliar o que estava causando a perda de desempenho.

Rede, acesso ao BD, algoritmos mal implementados, criação de objetos desnecessários… Se for feita uma avaliação é bem provável que o problema esteja fora da JVM.

Porém as vezes é mais fácil colocar a culpa no que não está sobre o nosso controle.


Interessante…

R

moacirjava:
Guerr@:
Acho que a grande questão é avaliar o que estava causando a perda de desempenho.

Rede, acesso ao BD, algoritmos mal implementados, criação de objetos desnecessários… Se for feita uma avaliação é bem provável que o problema esteja fora da JVM.

Porém as vezes é mais fácil colocar a culpa no que não está sobre o nosso controle.


Interessante…

Acredite vc pode usar JAVA ou C# em qualquer lugar ocupado por VB e o Delphi.

Claro se você vai escrever um software que auxilie uma cirurgia remota por exemplo esse sim é um lugar que JAVA não poderia ocupar, na verdade nem VB nem Delphi.

Embora eu imagino que no futuro nós poderemos escrever esse tipo software usando maquinas virtuais.

H

lauronolasco:
Guerr@…

novamente repito…
não estou colocando a culpa no java…
tanto é que consegui resolver o problema com o proprio java…

vcs ja trabalharam com ADC???

Nimguem analisou seu codigo, afinal vc não o postou… mas o seu relato aponta para uma resposta simples…
THREAD

M

Oi! É assim, o JIT grosseiramente falando a primeira vez roda mais lento, mas se a rotina for executada uma segunda vez, ela seria executada compilada, daí ganha performance.

Isso acontece quando você chama um método do Java mais de uma vez, ou quando o sistema entra em um loop. No caso que você colocou o link, o fibonnaci é um exemplo onde a compilação JIT funciona bem porque ele é praticamente repetição. Mas em um programa grande do “mundo real”, você vai ter códigos que podem ser repetidos e códigos sequenciais, então o aproveitamento vai ficar “numa média”.

O Delphi roda tudo nativo, daí é natural que seja mais rápido. Mas, como os colegas disseram, é pesar os prós e contras.

R

marcosalex:
r4it0.light:

Então qual o teste que você sugere para performance ?

Oi! É assim, o JIT grosseiramente falando a primeira vez roda mais lento, mas se a rotina for executada uma segunda vez, ela seria executada compilada, daí ganha performance.

Isso acontece quando você chama um método do Java mais de uma vez, ou quando o sistema entra em um loop. No caso que você colocou o link, o fibonnaci é um exemplo onde a compilação JIT funciona bem porque ele é praticamente repetição. Mas em um programa grande do “mundo real”, você vai ter códigos que podem ser repetidos e códigos sequenciais, então o aproveitamento vai ficar “numa média”.

O Delphi roda tudo nativo, daí é natural que seja mais rápido. Mas, como os colegas disseram, é pesar os prós e contras.

Na verdade marcos não fui eu quem postou o link com FIBONACCI.

M

Ops :oops:

Gosto do Delphi, acredito que pra programação desktop é a IDE mais produtiva de todas e desde 2005 eles aderiram aos padrões de projeto e incentivam o pessoal a separar a regra de negócios da interface, um vício que os programadores antigos tomavam, de colocar a lógica no botão.

R

É natural você gostar de uma ferramenta onde criou habilidades.

M

Java em desktop realmente é bem lento, isso em todos os programas em java desktop q conheço, só o start do programa é leeeeento.

Eu já fiz programas desktop em java e comparado com .net, nossa.

M

Creio que Swing seja uma API pesada, não lenta. Por ser pesada, geralmente é lenta no startup (pois carregar a API leva tempo), mas não durante a execução. E aqui estamos falando especificamente de Swing. Java é muito mais que isso, mesmo para aplicações desktop.

“Java não tem performance” é a típica frase de alguém que nunca fez um programa de verdade em Java e viu algum programa mal feito dando problemas desenvolvido por alguém que encheu de POGs o programa e colocou a culpa no Java.

r4it0.light:
Outra coisa que vale lembrar que o unico rival para o Java hj é o C#, que por sinal tem um framework para jogos sensacional o famoso XNA.

Já ouvi falar no XNA, mas nunca me aprofundei (até porque sou Linux User). O que ele tem demais? Outro dia vi um artigo sobre como criar um jogo 2D com XNA. A única diferença notável para o Java nesse código é que ele tem dois métodos herdados, um para carregar imagens (ImageIO.read em Java) e outro para ler o estado do teclado (KeyListener, em Java). Até então nada demais. Sem contar desvantagens como estar preso à tecnologia proprietária exclusiva da MS.

Já vi alguns screenshots para jogos 3D, mas creio que Java esteja ao mesmo nível para a maioria das coisas que se pode fazer (exceto para funções muito específicas, como do DirectX, por exemplo). Só como exemplo, vide jmonkeyengine.

G

Foi isso que um colega de classe falou para mim.
“… Você sabe que java é lento , vou estudar Delphi, isso com 2 anos++ de exp com Desktop…” Ele deve ter os motivos dele mais como um amigo falou no inicio do tópico nada me faz mudar para delphi.

L

Hellmanss:
lauronolasco:
Guerr@…

novamente repito…
não estou colocando a culpa no java…
tanto é que consegui resolver o problema com o proprio java…

vcs ja trabalharam com ADC???

Nimguem analisou seu codigo, afinal vc não o postou… mas o seu relato aponta para uma resposta simples…
THREAD

como eu falei num dos posts… usei thread e o problema foi amenizado, porém não me deu um retorno satisfatório para o meu caso.

como o r4it0.light disse:

V

O AWT foi criado com alguns erros de projeto graves. O Swing foi criado por cima do AWT com a intenção de substituí-lo (o que por si só já é um erro, pois se é para substituir, que não fizessem por cima). No entanto o Swing também contém os seus próprios erros de projeto.

O Swing é uma API pesada, em parte porque ele é projetado na forma de classes gigantescas, o que faz com que suas instâncias sejam gigantescas na memória. Excesso de consumo de memória trás problemas de desempenho quando ocorre swapping na memória cache ou pior ainda, swapping na memória virtual. O desempenho vai para o saco. Outro problema é que o próprio programa fica maior.

Além disso, pouca gente sabe, mas o AWT (e o swing vai junto) tem uma Thread de eventos dedicada a responder a interface gráfica e renderizar a tela, chamada Event Dispatch Thread (EDT). Quando esta thread acaba entrando em tarefas que abrem arquivos, fazem conexões de rede, esperam em blocos synchronized, fazem consultas no banco de dados ou fazem algum processamento pesado, a interface do usuário para de responder e o programa começa a engasgar. A solução para isso é simples: NUNCA FAÇA TAIS TAREFAS NA EDT. O problema é que grande parte dos programadores swing sequer sabe que existe essa EDT ou como ela funciona. Além disso, isolar estes códigos para rodarem em outras threads e fazer uma notificação correta entre threads é um trabalho razoavelmente difícil.

Se você não tomar cuidado com a EDT, o seu programa desktop em java VAI ficar extremamente lento e não há nada que você possa fazer exceto colocar as coisas nas threads corretas, algo que chuto que nem 5% dos programadores swing devem saber como fazer. Talvez nem 2%.

Como se isso não bastasse, as próprias tarefas que a EDT deve fazer podem ser lentas, tais como renderizar a tela ou fazer o layout corretamente. Tirar o máximo de desempenho dessas coisas é algo árduo e complexo. Mas felizmente, pouca gente precisa se dar ao trabalho de fazer isso, pois a maioria dos componentes já prontos são eficientes o bastante e dificilmente você pega um caso aonde não seja.

Mas, a pior parte é o coletor de lixo, que é uma das maiores pragas na questão de desempenho no java. Pode ocorrer que o coletor de lixo seja escalonado para o processador e outras threads parem, inclusive a EDT. E otimizar o desempenho do coletor de lixo e minimizar a interferência dele no desempenho do resto do sistema é algo bem chato, complicado e trabalhoso.

No entanto, o desempenho do swing vem melhorando cada vez mais. Já vi em algum lugar uma comparação de desempenho (estou com preguiça de procurar no google agora), mas a cada versão do java o desempenho do swing dá um salto gigantesco. No java 1.2 praticamente não era usável. No java 1.4 já era bem melhor, mas ainda era bem pesadão. No java 5 ficou razoavelmente leve. No java 6, ele já bate o delphi e o VB em alguns casos. Com o java 6 update 10 melhorou mais ainda. Que venha o java 7.

L

Porque Java pra Desktop era ruim. Podem me ignorar ou falar que estou errado, mas antes era lento e não tem nada que me faça pensar o contrário. Me desculpem a grosseria, mas já vi muita gente comentando que não é lento, que é só saber programar direito, mas ainda assim não me convenci.
Hoje é um pouco diferente… Ocorreram algumas alterações no Java 6 Update 10 (se não me engano, e no 7 está para melhorar mais ainda) que melhoraram a performance, então é bem provável que as coisas comecem a melhorar pro lado do Swing. Mas assim… Acho que Delphi é bem produtivo também, as vezes até mais que Java quando se trata de botõezinhos e caixinhas e formulários pra sistemas Desktop.

Sobre o Java 7, não lembro direito onde que li isso, mas ele vai ser quase 50% mais rápido que o Java 6. O Java 6, quando comparado ao 5, foi um pouco menos que 20% mais rápido. Acho que de uns tempos pra cá as coisas podem melhorar pro Java pra Desktop, quando Swing é usado. Eu, particularmente, já vi uma boa melhora na velocidade de aplicações Swing.

Dá uma procurada por Java 7 Performance. Devem ter vários artigos bem interessantes sobre esse tipo de coisa.

Oi,

Programa em Java Desktop a algum tempo (5 ou 6 anos…)… Nunca tive problemas com lentidão.

Tchauzi!

L

matarra1000:
Java em desktop realmente é bem lento, isso em todos os programas em java desktop q conheço, só o start do programa é leeeeento.

Eu já fiz programas desktop em java e comparado com .net, nossa.

Oi,

Tenho varios projetos Desktop como: Replicador de base de dados e um super TEF Dedicado. Ambos utilizando Swing, Threads, XML e outros conceitos.

Para ter uma ideia: O Replicador (Utilizando Swing, interface, banco e threads) é capaz de “puxar” um estabelecimento com quase 1mil lojas e sem problemas.

Tchauzin!

C

nunca tive problemas sérios de performance com o swing, mas testem com o java 6. Recentemente atualizamos os clients para jre 6 up 10 e as aplicações ficaram mais rápidas.

K

lauronolasco:
Hellmanss…

vc viu o código pra dizer que é “nas coxas”???
vc ja trabalhou com alguma tarefa de precisão em função do tempo com java???

em nenhum momento eu coloquei a culpa no java…
mas é inegável que pra trabalhar com desktop ele é mais lento…
dependendo do seu problema, essa diferença no tempo pode não influenciar o resultado final…
ou pode… como foi o meu caso!!!


Deveriam ter usado então a JVM em “tempo real” que a IBM fez para algum projeto estranho para o exército americano, uma JVM que precisava estar num ambiente em “tempo real”, rodando sobre uma distribuição Linux em “tempo real”. Ou então a própria solução da Sun para Java em “tempo real”.

Inté.

F

Tivemos em algums projetos algum problema quando o Hibernate conectava com o Banco, e isso causava uma certa lentidão, alguns segundos de espera, mas os novos sistemas que foram feitos, foi usando Swing e uma camada EJB, a aplicação Swing voou, e ficou muito mais rapida que as aplicações feitas em Delphi (O Sistema tinha a versão em Delphi e foi reescrito para Java). Além da interface ficar mais elegante ficou muito rápido.

Antigamente também achava que java para Desktop era lento, hoje em dia penso diferente.

R

Oops

Correção aplicações em tempo real podem ser escritas em JAVA segue o link

http://java.sun.com/javase/technologies/realtime/index.jsp

Embora nos casos que você queira utilizar tudo que o hardware possa te oferecer nada melhor que o bom e velho C
A

Felagund, por um acaso vocês não criavam um EntityManagerFactory sempre que iam lidar com o banco?

Lina, eu quis dizer na parte de Swing do Java. Pelo menos comigo e com uma fatia bem grandinha de pessoas era lento. Hoje a história é, de fato, bem diferente.

F

Andre Brito:
Felagund, por um acaso vocês não criavam um EntityManagerFactory sempre que iam lidar com o banco?

Lina, eu quis dizer na parte de Swing do Java. Pelo menos comigo e com uma fatia bem grandinha de pessoas era lento. Hoje a história é, de fato, bem diferente.

Existiam diversos problemas justamente com o EntityManager, existia pouco reaproveitamento, então ele era lento por ser mal implementado :P. No final foi ajustado e reescrito, digamos que era um cobaia para testes, no final ele ficou razoavel, e os outros feitos com base nele ficaram muito melhor.

A

Humm… Perguntei isso porque cometi o erro de criar um EMFactory toda vez que ia usar o EntityManager. Cada operação demorava uns 3 segundos… Aí que fui ler que a criação da Factory é muito cara e deve ser bem limitada no código. Tudo isso pode ser ‘poupado’ de ser feito ao usar DI com @PersistenceContext quando usamos CMP (que já vem no JBoss, por exemplo).

M

victorwss:
Além disso, pouca gente sabe, mas o AWT (e o swing vai junto) tem uma Thread de eventos dedicada a responder a interface gráfica e renderizar a tela, chamada Event Dispatch Thread (EDT). Quando esta thread acaba entrando em tarefas que abrem arquivos, fazem conexões de rede, esperam em blocos synchronized, fazem consultas no banco de dados ou fazem algum processamento pesado, a interface do usuário para de responder e o programa começa a engasgar. A solução para isso é simples: NUNCA FAÇA TAIS TAREFAS NA EDT. O problema é que grande parte dos programadores swing sequer sabe que existe essa EDT ou como ela funciona. Além disso, isolar estes códigos para rodarem em outras threads e fazer uma notificação correta entre threads é um trabalho razoavelmente difícil.

Se você não tomar cuidado com a EDT, o seu programa desktop em java VAI ficar extremamente lento e não há nada que você possa fazer exceto colocar as coisas nas threads corretas, algo que chuto que nem 5% dos programadores swing devem saber como fazer. Talvez nem 2%.

Como se isso não bastasse, as próprias tarefas que a EDT deve fazer podem ser lentas, tais como renderizar a tela ou fazer o layout corretamente. Tirar o máximo de desempenho dessas coisas é algo árduo e complexo. Mas felizmente, pouca gente precisa se dar ao trabalho de fazer isso, pois a maioria dos componentes já prontos são eficientes o bastante e dificilmente você pega um caso aonde não seja.


Pois é… o maior problema de programas em Java (e em qualquer outra linguagem) são desenvolvedores mal informados (ou as vezes mal preparados) que fazem aquela POG e depois reclamam da linguagem.

victorwss:
No entanto, o desempenho do swing vem melhorando cada vez mais. Já vi em algum lugar uma comparação de desempenho (estou com preguiça de procurar no google agora), mas a cada versão do java o desempenho do swing dá um salto gigantesco. No java 1.2 praticamente não era usável. No java 1.4 já era bem melhor, mas ainda era bem pesadão. No java 5 ficou razoavelmente leve. No java 6, ele já bate o delphi e o VB em alguns casos. Com o java 6 update 10 melhorou mais ainda. Que venha o java 7.

(Que venha o java 7!)++

A

r4it0.light:
Alguém aqui vai desenvolver sistemas de tempo real se sim então JAVA é lento.

Vá estuda C mas C puro onde entra orientação a objeto já começa a fica lento.

Boa sorte com os controles de estoque em tempo real :smiley:

Vale lembrar que JVMs tipo JRockit (Oracle) servem pra isso.

[]´s

V

lauronolasco:
vc viu o código pra dizer que é “nas coxas”???
vc ja trabalhou com alguma tarefa de precisão em função do tempo com java???

Eu já. Trabalhei por 6 anos com sistemas de tempo real, com Java. E em muitos casos era mais fácil obter a performance nele do que no C++.

Entretanto, tenho que concordar à respeito da API de serial/paralela. Não deve ser culpa do Java, mas da implementação da javax.comm. Não é à toa que ela foi descontinuada para o Windows.

F

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…

Aí é sacanagem né…

Mas em compensação Java é bem mais produtivo que C/C++… vai ver as classes de String em C/C++… ou vai ver as funções de data de C/C++… ou manipulação de arquivos… threads… Web então nem se fala… imagine fazer alguma coisa com CGI… tenho até pena de quem fez isso… Java tem no máximo 10 frameworks conhecidos para cada problema… em C/C++ existem 1 framework para cada empresa… tem vezes(muitas) que existe até 1 framework por programador da empresa…

Fora que um ponteiro errado faz sua aplicação dar crash ou até mesmo invadir outra parte de sua aplicação… em Java isso nunca iria acontecer… o problema mais próximo do Java seria o famoso null pointer exception… mas mesmo assim centenas de vezes menos grave do que um ponteiro mal configurado…

Mas sempre tem aqueles que vão falar… ah, mas se você usar JNI e usar as classes NIO…

V

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…

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.

K

r4it0.light:
Alguém aqui vai desenvolver sistemas de tempo real se sim então JAVA é lento.

Vá estuda C mas C puro onde entra orientação a objeto já começa a fica lento.

Boa sorte com os controles de estoque em tempo real :smiley:

Há uma especificação de Java específica para RealTime, acho que vale à pena dar uma olhada - http://java.sun.com/javase/technologies/realtime/index.jsp

Hoje a solução de 60% das corretoras de WallStreet para operar em tempo real ordens de compra, com latência inferior à 2ms e algorítimos pesados de Trading é o Apama - Progress, engine baseada em Complex Events e escrito em Java.

Neste post do InfoQ vai achar algumas menções sobre o Esper e o BEA Event Server - http://www.infoq.com/news/2007/06/bea-realtime2-eventserver . Esse utiliza a JRockt uma VM com qualidade superior à da Sun para tempo real, aliás, dizem que essa agora com a aquisição da SUN será a versão paga.

Por fim, Java em tempo Real não somente é viável como existe todo um ecossistema de frameworks e soluções. 8)

Agora um sistema de estoque não precisa dessa precisão de 2ms. Você deve estar fazendo algo errado. Vamos lembrar:

O Ebay processa 5 bilhões de chamadas por mês, isso integrando chamadas nativas, soap, entre outras - http://highscalability.com/ebay-architecture

O Twitter, escrito hoje em Scala, roda em cima da JVM.

Diversas empresas de Telefonia, usam sistema de billing escrito em Java (são pesadíssimos), sistemas de home banking e por aí vai.

A Oracle possui o FusionMiddleware que serve de arquitetura para muitas companhias, baseado em Java, assim como a IBM com a linha Websphere e a SAP com o NetWeaver

Hoje, com excessão ao BizzTalk da Microsoft, todos os ESBs de mercado são escritos em Java e lidam com patterns de integração, SLA, tradução de protocolo e precisam escalar em milhares de transações por segundo : http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=esb+oracle+performance

Java enquanto plataforma, pra mim em questões ServerSide é imbatível. Acredito muito no futuro de linguagens em cima da plataforma como Scala para desenvolvimento de infraestrutura e Ruby para design de produtos.

E

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…

Aí é sacanagem né…

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?

R

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.

S

Eu acho que é um pouco questão de produtividade, eu li a algum tempo que se queremos um projecto pequeno de 1 mês e com um programador por exemplo , não se pensa 2 vezes e é bom avançar com php ou asp ou outra linguagem de rapido desenvolvivento.

E tambem entendi que se quisermos trabalhar num projecto numa equipa grande e se tivermos alguns meses para acabar com o projecto e se o projecto for algo que é bom que seja de facil manutenção e reusabilidade do código , sem sombra de duvidas é java na certa.

Pode ser que esteja errado, mas eu encaro assim a idea

V

Bom, primeiro de tudo, é necessário dizer o que é um sistema de “tempo real”. Um sistema de tempo real é um sistema que, para determinados processamentos, existe um intervalo de tempo máximo que esse possa ser realizado. Note que isso não implica em um sistema em que tudo deva ser realizado em poucos milisegundos, pois um sistema de tempo real pode, até mesmo, ter esse tempo estipulado em minutos.

O sistema é dito de “soft real time”, se esse intervalo pode ser ferido ocasionalmente, o que gerará uma perda controlada.
O sistema é dito de “hard real time” se ao ferir esse intervalo, a perda inviabiliza o uso do sistema.

O problema do Java no real time é que ele não permite que você faça uma aplicação determinística, por mais esmero que você tenha. Afinal, o garbage collector não estará sobre seu controle, e a aplicação vai literalmente pausar quando ele roda. Portanto, é importante analisar a duração média dessas pausas no seu sistema, e ver se elas ferem o intervalo de tempo estipulado, ou se elas são toleráveis como “perdas controladas”, no caso do soft real time.

K

Quer saber a verdade? A PURA verdade?

Então vai (não joguem pedras): em 99% dos casos que já vi semelhantes a estes quem criticava Java era justamente o povo do “arrastar e soltar”.
Gente que só sabia programar com a parte visual do Delphi, VB6 ou Visual Studio e que, ao topar com Java, por não ter base alguma, dava com os burros n’água.
Simples assim.

Ai a tecnologia é ruim, não funciona direito, etc…
Sempre o MESMO papinho furado.

É o pessoal que, costumo dizer, vive na caverna (já escrevi sobre isto aqui: http://www.itexto.net/devkico/?p=273 )

ps:
não, não estou dizendo que Delphi, VB6 ou Visual Studio sejam ruins, mas sim que o povinho do “arrasta e solta” cria o inferno pro pessoal ao redor e não sabe (ou pior ainda, sabem!)

V

Mas o VB6 é mesmo ruim. Muito ruim.

F

Concordo com kicolobo, infelizmente java não é para qualquer um. Eu não pensava assim…mas a cada dia que passa me aproximo mais desta conclusão.

Outra coisa que já observei e comprovei: quem aponta performance como ponto negativo em Java é porque tem problemas com programação em qualquer linguagem OO na maioria dos casos. A diferença é que linguagens como Delphi acoberta este tipo de coisa, ela causa uma espécie de compensação.

A lentidão na API Swing é uma fato, porem a SUN tem trabalhado no assunto nos últimos tempos (como já foi muito bem explicado antes). Detalhe, a SUN começou a trabalhar nisto por causa de muita insistencia das comunidades. Ou seja, o mercado desktop era dominado pelas linguagens Delphi, VB e outros “gatos pingados” e ela (SUN) nunca teve interesse em “entrar” nesta àrea por saber do real potencial das linguagens alí estabelecidas; concordemos, a Microsoft está no mundo desktop a muito tempo e ela não pode ser tão ruim assim - experiencia é que não falta.

Isto significa dizer que se vc escolheu Java para fazer uma coisa que Delphi / VB / etc… poderiam fazer bem então o erro foi seu; não soube analisar e escolher a ferramenta correta para o problema em questão.

Só escolha a plataforma Java se vc concluir que o problema será melhor resolvido com ela, caso contrario resultará em discusões sem sentido.

Mais uma coisa, tem profissional que acha que fazer POGs “na moita” na plataforma Java vai ficar por isso mesmo; não fica de jeito nenhum. Mais cedo ou mais tarde o problema aparece e normalmente é em forma de baixa perfomance.

flws

T

kicolobo:
Quer saber a verdade? A PURA verdade?

Então vai (não joguem pedras): em 99% dos casos que já vi semelhantes a estes quem criticava Java era justamente o povo do “arrastar e soltar”.
Gente que só sabia programar com a parte visual do Delphi, VB6 ou Visual Studio e que, ao topar com Java, por não ter base alguma, dava com os burros n’água.
Simples assim.

Ai a tecnologia é ruim, não funciona direito, etc…
Sempre o MESMO papinho furado.

É o pessoal que, costumo dizer, vive na caverna (já escrevi sobre isto aqui: http://www.itexto.net/devkico/?p=273 )

ps:
não, não estou dizendo que Delphi, VB6 ou Visual Studio sejam ruins, mas sim que o povinho do “arrasta e solta” cria o inferno pro pessoal ao redor e não sabe (ou pior ainda, sabem!)

Adorei!

Esses dias tava acompanhando uma discução na lista de flex e o pessoal tava reclamando do eclipse.
Estavam dizendo que sem a ferramenta dnd o eclipse se torna um “notepad pesado”.
Ou seja, tirou o arrasta e solta a galera já não sabe mais programar… se é que sabia antes.
E a culpa é da IDE, lógico, afinal onde já se viu uma IDE sem dnd, absurdo!!

V

Uma coisa que o Java é realmente ruim é na integração com SO ou com hardware externo. Se você precisa disso, pense bem se o resto da API do Java vai compensar essa desvantagem. Escrever JNI é difícil, sujeito a erros, perigoso, e é C++, não Java.

E

Rubem Azenha:
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?

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.

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.

C

Você pode usar qualquer linguagem que gere codigo nativo para criar uma JNI…

Nao precisa ser C++

Se quiser pode até utilizar o delphi (Já fiz isso varias vezes)…

:slight_smile:

JNI is Easy e normalmente constitui 2% a 10% no maximo do seu software…

Não justifica trocar 90% por 10%… escreve 90% em java e 10% em delphi via dll … pronto… melhor dos dois mundos :slight_smile:

E

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.

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.

V

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…

J

evandro.santos:
Rubem Azenha:
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?

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.

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.

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.

J

entanglement:
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.

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.

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.

J

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…

É 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.

S

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.

M

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.

T

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.

J

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
J

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.

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.

J

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

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

K

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.

V

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.

T

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.

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

J

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.

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

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

V

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

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

V

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

T

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

M

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.

S

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.

M

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.

B

marcobiscaro2112:

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.

jna realmente é muito legal, mas…
pense no seguinte: se alguma outra plataforma conseguisse chamar métodos em java e tivesse mapeados os tipos primitivos, seria o suficiente?

jni da dor de cabeça, pq na maioria dos casos não da pra escapar de implementar uma fachada em código nativo (algo entre a biblioteca e o java) pelo seguinte motivo: o tratamento de excessões em tempo de execução… como exceptions, null pointers da vida, estouros de memória etc etc.

Ou seja, uma linguem é mais que mapeamentos e chamadas a métodos.

É por causa de coisinhas assim que existe uma linha muito tenue entre escrever uma aplicação em java que use (ou seja) um grande wrapper e partir para programar diretamente em código nativo.

K

Eu acho Delphi assim como VB viáveis para micro-empresas, de até 10 funcionários, pdas, que você tem um orçamento baixo e precisa de muita produtividade e um valor hora baixo também.

M

bobmoe:
marcobiscaro2112:

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.

jna realmente é muito legal, mas…
pense no seguinte: se alguma outra plataforma conseguisse chamar métodos em java e tivesse mapeados os tipos primitivos, seria o suficiente?

De forma alguma. Tanto que JNA tem suporte a ponteiros e structs, por exemplo.

bobmoe:

jni da dor de cabeça, pq na maioria dos casos não da pra escapar de implementar uma fachada em código nativo (algo entre a biblioteca e o java) pelo seguinte motivo: o tratamento de excessões em tempo de execução… como exceptions, null pointers da vida, estouros de memória etc etc.

Ou seja, uma linguem é mais que mapeamentos e chamadas a métodos.


Realmente uma linguagem é mais que isso. Mas não necessariamente é necessário uma “camada” entre a biblioteca nativa e o Java. Só como exemplo, veja o port do GStreamer ou do VLC em Java. Apenas JNA e funciona extremamente bem.

E

Algo que a comunidade Ruby já assimilou e que faria bem parte da comunidade Java também entender é que mesmo que em alguns cenários a plataforma seja lenta, ela é rápido o suficiente para a maioria das situações, até porque a grande maioria das aplicações comerciais não têm requisitos tão críticos de performance.

O mais importante, ao meu ver, é a performance dos desenvolvedores, ou seja, a produtividade. Isso sim me faz optar por uma plataforma específica em algum projeto.

J

sergiotaborda:
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.

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.

Você olhou o código fonte desse benchmark?

Existem instruções que serão otimizadas com certeza, e se você não ligar o otimizador do seu compilador c++, realmente ele não vai corrigir blocos inúteis do seu código.

Eu nunca vi um benchmark que mostra java com mais performance que c++, que fosse correto. Sempre o compilador c++ não estava com otimização ligada, ou o codigo era mentiroso.

ex:

for(int i=0; i<10000; i++){

// nada aqui dentro. Oras, com certeza a otimização corta fora, esse código

}

Usei o nivel 1 aqui do g++, e olha o resultado:




S

juliocbq:
sergiotaborda:
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.

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.

Você olhou o código fonte desse benchmark?

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.

V

Fora que, se alguém usa a linguagem hoje em dia para justificar problemas de performance na sua aplicação, é porque é um mau desenvolvedor. Para a maior parte de aplicações de escritório, a lentidão não será a linguagem, em hipótese alguma. Mesmo no caso do Swing e do Java.

Se você está fazendo aplicações ligadas as que eu e o Julio trabalhamos, aí sim, você terá que escolher conviver ou não com os congelamentos do GC. São congelamentos esporádicos e curtos, o que atende boa parte dos sistemas de softrealtime. Mas veja, não será por causa da velocidade da execução em si, mas de uma característica intrínseca do GC, que é paralizar a aplicação.

Se você faz aplicações científicas, onde 99% do seu processamento é mesmo calculo, aí você usa C++. Até porque, nesse caso provavelmente você estará trabalhando com um mainframe.

J

sergiotaborda:
juliocbq:
sergiotaborda:
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.

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.

Você olhou o código fonte desse benchmark?

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.

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.

J

ViniGodoy:
Fora que, se alguém usa a linguagem hoje em dia para justificar problemas de performance na sua aplicação, é porque é um mau desenvolvedor. Para a maior parte de aplicações de escritório, a lentidão não será a linguagem, em hipótese alguma. Mesmo no caso do Swing e do Java.

Se você está fazendo aplicações ligadas as que eu e o Julio trabalhamos, aí sim, você terá que escolher conviver ou não com os congelamentos do GC. São congelamentos esporádicos e curtos, o que atende boa parte dos sistemas de softrealtime. Mas veja, não será por causa da velocidade da execução em si, mas de uma característica intrínseca do GC, que é paralizar a aplicação.

Se você faz aplicações científicas, onde 99% do seu processamento é mesmo calculo, aí você usa C++. Até porque, nesse caso provavelmente você estará trabalhando com um mainframe.

Em questão java tem ótima performance, e diferença não é tão grande se formos levar em conta gerência de memória automatica e n outras coisas que a vm te dá. Mas não acho justo comparar c++ com java, pelas razões citadas acima.

Máquina virtual é uma coisa, Máquina real é outra.

V

Eu também já fiz muitos benchmarks, e o C++ geralmente se sai melhor. Muito melhor. Mesmo ativando só otimização básica (o1).

Geralmente os benchmarks de java que dizem o contrário são de pessoas que não programam em C++ e fazem a compilação de qualquer jeito. Ou que compilaram lá no devcpp com um mingw de 1996 e estão comparando com a última versão do JDK…

O pior é que os benchmarks geralmente são de códigos quase 100% matemáticos, o que deve ser a realidade de no máximo 1% das pessoas do fórum.

No geral, em aplicações comerciais, gargalos de performance estão em outros locais, geralmente relacionados a I/O: Banco de dados, rede, leitura de arquivos. Existe problemas também por erros de software, como escolher a estrutura de dados errada.

M

ViniGodoy:
Eu também já fiz muitos benchmarks, e o C++ geralmente se sai melhor. Muito melhor. Mesmo ativando só otimização básica (o1).

Geralmente os benchmarks de java que dizem o contrário são de pessoas que não programam em C++ e fazem a compilação de qualquer jeito. Ou que compilaram lá no devcpp com um mingw de 1996 e estão comparando com a última versão do JDK…

O pior é que os benchmarks geralmente são de códigos quase 100% matemáticos, o que deve ser a realidade de no máximo 1% das pessoas do fórum.

No geral, em aplicações comerciais, gargalos de performance estão em outros locais, geralmente relacionados a I/O: Banco de dados, rede, leitura de arquivos. Existe problemas também por erros de software, como escolher a estrutura de dados errada.

Concordo.
E pras máquinas de hoje, a não ser em situações muito específicas, essa perda de performance do Java não faz tanta falta assimse comparado ao benefício.

J

Com certeza não faz nenhuma diferença. Alta Performance é exigida em situações muito específicas, em que um programa tem que tomar decisões em tempo crítico(Ex uma aplicação capturar uma cena de 500 ms, em arquivo de vídeo). O benefício é enorme, tanto em tempo de desenvolvimento, e na própria segurança da aplicação.

Com as melhorias no coletor de lixo, na versão 7, java deve diminuir mais esse passo.

M

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.

Só ressaltando que não abri este tópico para defender Delphi. Trabalho com Delphi mas, não por opção, e sim por necessidade. Minha preferência seria Java ou C#. Abri este tópico para saber o por que os programadores/desenvolvedores de outras linguagens falam tão mal de Java. Nada mais.

J

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.

Só ressaltando que não abri este tópico para defender Delphi. Trabalho com Delphi mas, não por opção, e sim por necessidade. Minha preferência seria Java ou C#. Abri este tópico para saber o por que os programadores/desenvolvedores de outras linguagens falam tão mal de Java. Nada mais.

Mas quem falou mal de java, ou qualquer outra ferramenta ou linguagem, aqui?

Só estamos debatendo vantagens e desvantagens. Endeusar uma linguagem de programação não traz benefício algum.

M

Ok…

K

Este tipo de discussão pra mim se resume ao meu argumento “Pascal e o nerd tiraninho”: http://www.itexto.net/devkico/?p=596

resumindo: uma tecnologia não é como um martelo para o qual todos os problemas são igualmente pregos. :slight_smile:

J

sergiotaborda:
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

Imagina vc com uma doença rara, 10 dias de expectativa de vida e 200 médicos calculando a dose certa do remédio.
Destes, 100 médicos usando C++ e 100 médicos usando JAVA, cada um em seu PC.
Os médicos usando C++ trariam 100 respostas diferentes a cada dia totalizando 1000 respostas imprecisas, enquanto que os médicos usando JAVA trariam 100 respostas iguais no décimo dia totalizando 1 resposta precisa.

J

Não dá para comparra o desempenho de uma linguagem compilada com o desempenho de uma linguagem interpretada. Cada uma tem seus benefícios e seus pontos fracos. Se você tentar cortar o pão com a colher e tomar sopa com a faca, vai se dar mal. Com as liguagens é assim também.

J

Java Lover:
sergiotaborda:
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

Imagina vc com uma doença rara, 10 dias de expectativa de vida e 200 médicos calculando a dose certa do remédio.
Destes, 100 médicos usando C++ e 100 médicos usando JAVA, cada um em seu PC.
Os médicos usando C++ trariam 100 respostas diferentes a cada dia totalizando 1000 respostas imprecisas, enquanto que os médicos usando JAVA trariam 100 respostas iguais no décimo dia totalizando 1 resposta precisa.

??

S

Java Lover:
sergiotaborda:
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

Imagina vc com uma doença rara, 10 dias de expectativa de vida e 200 médicos calculando a dose certa do remédio.
Destes, 100 médicos usando C++ e 100 médicos usando JAVA, cada um em seu PC.
Os médicos usando C++ trariam 100 respostas diferentes a cada dia totalizando 1000 respostas imprecisas, enquanto que os médicos usando JAVA trariam 100 respostas iguais no décimo dia totalizando 1 resposta precisa.

Exatamente. A resposta no primeiro dia seria igual a todos os outros. O te daria 9 dias para administrar a dose…

V

Java Lover:
Imagina vc com uma doença rara, 10 dias de expectativa de vida e 200 médicos calculando a dose certa do remédio.
Destes, 100 médicos usando C++ e 100 médicos usando JAVA, cada um em seu PC.
Os médicos usando C++ trariam 100 respostas diferentes a cada dia totalizando 1000 respostas imprecisas, enquanto que os médicos usando JAVA trariam 100 respostas iguais no décimo dia totalizando 1 resposta precisa.

Bom, o que acontece é que num sistema crítico, talvez o Java dê 100 respostas iguais no 11º dia. Enquanto o C++ associado a um hardware médico específico, te dê essa resposta nos primeiros 30 minutos, e com muito mais precisão, já que ele irá usar um padrão muito melhor do que o do IEEE…

Se a situação é crítica assim, é bem provável que você não estará usando o C++ levianamente, como no exemplo supracitado.

S

ViniGodoy:
Java Lover:
Imagina vc com uma doença rara, 10 dias de expectativa de vida e 200 médicos calculando a dose certa do remédio.
Destes, 100 médicos usando C++ e 100 médicos usando JAVA, cada um em seu PC.
Os médicos usando C++ trariam 100 respostas diferentes a cada dia totalizando 1000 respostas imprecisas, enquanto que os médicos usando JAVA trariam 100 respostas iguais no décimo dia totalizando 1 resposta precisa.

Bom, o que acontece é que num sistema crítico, talvez o Java dê 100 respostas iguais no 11º dia. Enquanto o C++ associado a um hardware médico específico, te dê essa resposta nos primeiros 30 minutos, e com muito mais precisão, já que ele irá usar um padrão muito melhor do que o do IEEE…

Agora fiquei curioso. qual é esse padrão que é melhor que o do IEEE e porquê é melhor ?

V

Na verdade, estou falando do strictfp, que impõe os calculos para precisão de single ou double (definido no padrão por 32 ou 64 bits).
Por isso o java dá um resultado idêntico em todas as plataformas.

Se for uma VM sem isso imposto, o resultado do cálculo será idêntico ao do C++, um para cada plataforma.

Agora, numa aplicação C++, vc poderia realizar cálculos com precisão quádrupla, numa máquina que tivesse um registrador de calculo de 128 bits, por exemplo. Ou mesmo usar processadores de 256 bits de precisão (que já fogem do padrão), como é feito em algumas aplicações meteorológicas.

O exemplo é que foi ruim, pois ele considera um software crítico, onde o hardware específico geralmente é usado. E, quando o assunto é manipular um hardware específico, você terá mais dificuldades se tiver uma máquina virtual sobre ele, pelo próprio conceito de máquina virtual em si.

Numa aplicação crítica, isso poderia ser a diferença entre obter 100 respostas idênticas, mas incorretas, ou respostas corretas num hardware específico. Existe mais dificuldade e menos portabilidade? Claro. Mas estavamos falando aqui em algo capaz de calcular a dosagem de medicamentos em tempo recorde, e salvar vidas, não?

J

creio que não seria correto dizer que as respostas seriam imprecisas. O que aconteceria é que a precisão numérica seria diferente de acordo com o hardware, como o vini explicou, mas ambos os software chegariam a resposta correta. A diferença está na velocidade do cálculo e nas casas decimais.

J

ViniGodoy:
O exemplo é que foi ruim, pois ele considera um software crítico, onde o hardware específico geralmente é usado. E, quando o assunto é manipular um hardware específico, você terá mais dificuldades se tiver uma máquina virtual sobre ele, pelo próprio conceito de máquina virtual em si.
Numa aplicação crítica, isso poderia ser a diferença entre obter 100 respostas idênticas, mas incorretas, ou respostas corretas num hardware específico. Existe mais dificuldade e menos portabilidade? Claro. Mas estavamos falando aqui em algo capaz de calcular a dosagem de medicamentos em tempo recorde, e salvar vidas, não?
Por este motivo que o instrumento (robô) no qual trabalhei, foi programado em Fortran, liberando um diagnóstico sanguíneo em 6 segundos, contra 60 segundos em Delphi, 180 segundos em VB.
Java x C++ ficaram equivalentes em 30 segundos.
Tempos médios aproximados.
A solução híbrida de Fortran + (Delphi ou VB ou Java ou C++) possibilitou cálculos rápidos e precisos no Fortran e apresentação agradável da GUI nas outras LPs.
Vários outros instrumentos que trabalhei continuaram com puro Fortran usando LCD mas sempre ultra-rápidos e confiáveis.

M

Existem bibliotecas em C++ pra esse tipo de operação.

C

Fico aqui me perguntando… se C++ é tão maravilhoso… prq não programamos todos para C++ na web ?

Outra coisa que não entendo : http://br-linux.org/2010/crescimento-faz-twitter-trocar-o-mysql-pelo-cassandra

Prq eles nao desenvolvem em C++ tudo ? PARA QUE FICAR UTILIZANDO JAVA ? VIVA !

PS: Olha que legal , aqui posso editar as minhas mensagens !!! Agora fico tão hacker quanto o Augusto do Br-Linux

T

Java Lover:
Por este motivo que o instrumento (robô) no qual trabalhei, foi programado em Fortran, liberando um diagnóstico sanguíneo em 6 segundos, contra 60 segundos em Delphi, 180 segundos em VB.
Java x C++ ficaram equivalentes em 30 segundos.
Tempos médios aproximados.
A solução híbrida de Fortran + (Delphi ou VB ou Java ou C++) possibilitou cálculos rápidos e precisos no Fortran e apresentação agradável da GUI nas outras LPs.
Vários outros instrumentos que trabalhei continuaram com puro Fortran usando LCD mas sempre ultra-rápidos e confiáveis.

Interessante saber.

J

chun:
Fico aqui me perguntando… se C++ é tão maravilhoso… prq não programamos todos para C++ na web ?

Outra coisa que não entendo : http://br-linux.org/2010/crescimento-faz-twitter-trocar-o-mysql-pelo-cassandra

Prq eles nao desenvolvem em C++ tudo ? PARA QUE FICAR UTILIZANDO JAVA ? VIVA !

PS: Olha que legal , aqui posso editar as minhas mensagens !!! Agora fico tão hacker quanto o Augusto do Br-Linux

Porque na Web o Java leva vantagem… como o C++ leva vantagem pra hardwares especificos… ( Ou nao :roll: )

C

Ué , o Twitter tem um hardware bem espcifico… eles poderiam ter todo o poder do C++

Fico aqui imaginando prq eles nao querem este poder…

Hummm Hummmm

V

chun:
Fico aqui me perguntando… se C++ é tão maravilhoso… prq não programamos todos para C++ na web ?
Outra coisa que não entendo : http://br-linux.org/2010/crescimento-faz-twitter-trocar-o-mysql-pelo-cassandra
Prq eles nao desenvolvem em C++ tudo ? PARA QUE FICAR UTILIZANDO JAVA ? VIVA !

PS: Olha que legal , aqui posso editar as minhas mensagens !!! Agora fico tão hacker quanto o Augusto do Br-Linux

Por que alguém sempre faz essa pergunta idiota quando alguém aparece falando das situações em que o C++ é mais vantajoso?

Não se programa em C++ para tudo pelo mesmo motivo que você não deve programar em Java para tudo. Simples assim.

O C++ é mais otimizável que o Java, porém, para aplicações comerciais comuns, o custo dessa característica é alto demais para compensar o eventual benefício.

A notícia que você postou também é um péssimo exemplo. Ela compara o MySQL, que é feito em C++, com um BD Java que usa uma tecnologia diferente da relacional. Ou seja, diferenças de performance aí não estão relacionadas à linguagem e sim aos algoritmos utilizados.

V

Até onde eu sei, ninguém do Twitter está programando o BD que eles mesmo usam. Também não me parece que um hardware específico e otimizado seja fator de sucesso para o twitter. Afinal, é mais barato e rápido investir em comprar mais hardware genérico, ao invés de simplesmente fazer um software usar todos os recursos dos equipamentos que eles tem.

J

chun:
Ué , o Twitter tem um hardware bem espcifico… eles poderiam ter todo o poder do C++

Fico aqui imaginando prq eles nao querem este poder…

Hummm Hummmm

Resposta nesse mesmo tópico:

ViniGodoy:
benchmarks geralmente são de códigos quase 100% matemáticos, o que deve ser a realidade de no máximo 1% das pessoas do fórum.

No geral, em aplicações comerciais, gargalos de performance estão em outros locais, geralmente relacionados a I/O: Banco de dados, rede, leitura de arquivos. Existe problemas também por erros de software, como escolher a estrutura de dados errada.

No caso existem gargalos no Banco de Dados (que, aliás, são feitos em C ou C++), na conexão, leitura de arquivos. Assim toda a vantagem em performance do C++ se torna menos importante.

No caso do Twitter, veja essa página e perceba como eles usam, sim, C++ quando eles acham mais conveniente.

C

ViniGodoy:
chun:
Fico aqui me perguntando… se C++ é tão maravilhoso… prq não programamos todos para C++ na web ?
Outra coisa que não entendo : http://br-linux.org/2010/crescimento-faz-twitter-trocar-o-mysql-pelo-cassandra
Prq eles nao desenvolvem em C++ tudo ? PARA QUE FICAR UTILIZANDO JAVA ? VIVA !

PS: Olha que legal , aqui posso editar as minhas mensagens !!! Agora fico tão hacker quanto o Augusto do Br-Linux

Por que alguém sempre faz essa pergunta idiota quando alguém aparece falando das situações em que o C++ é mais vantajoso?

Não se programa em C++ para tudo pelo mesmo motivo que você não deve programar em Java para tudo. Simples assim.

O C++ é mais otimizável que o Java, porém, para aplicações comerciais comuns, o custo dessa característica é alto demais para compensar o eventual benefício.

A notícia que você postou também é um péssimo exemplo. Ela compara o MySQL, que é feito em C++, com um BD Java que usa uma tecnologia diferente da relacional. Ou seja, diferenças de performance aí não estão relacionadas à linguagem e sim aos algoritmos utilizados.

Vini,

Idiota é a conclusao que quem lê esta thread chega… Aqui tem um monte de exemplos confusos e puxando cada um para sua sardinha…

A noticia que eu postei é um belo exemplo de um pessoal que antes tinha uma arquitetura dita “ideal aos projetos do novo milenio” e agora esta correndo dela… indo tudo para java…

Se voce analisar simploriamente o contexto da noticia vai chegar a esta sua conclusao… se voce perceber o que estou me referindo a PLATAFORMA e nao a apenas uma linguagem , ai voce percebe o que eu quero dizer

Quanto ao algoritimo nao me venha com churumelas… existem dezenas de aplicativos implementando MapReduce em C++… e mesmo assim optaram por Java.

C

Até onde eu sei, ninguém do Twitter está programando o BD que eles mesmo usam. Também não me parece que um hardware específico e otimizado seja fator de sucesso para o twitter. Afinal, é mais barato e rápido investir em comprar mais hardware genérico, ao invés de simplesmente fazer um software usar todos os recursos dos equipamentos que eles tem.

E isso se aplica quando seu nivel de inclusao de novos registros pula de 2 milhoes para 50 milhoes ao dia ?

C

Até onde eu sei, ninguém do Twitter está programando o BD que eles mesmo usam. Também não me parece que um hardware específico e otimizado seja fator de sucesso para o twitter. Afinal, é mais barato e rápido investir em comprar mais hardware genérico, ao invés de simplesmente fazer um software usar todos os recursos dos equipamentos que eles tem.

E hardware especifico só posso utilizar quando eu faço tudo do zero ? Complicado hein ?

C

juliofsn:
chun:
Ué , o Twitter tem um hardware bem espcifico… eles poderiam ter todo o poder do C++

Fico aqui imaginando prq eles nao querem este poder…

Hummm Hummmm

Resposta nesse mesmo tópico:

ViniGodoy:
benchmarks geralmente são de códigos quase 100% matemáticos, o que deve ser a realidade de no máximo 1% das pessoas do fórum.

No geral, em aplicações comerciais, gargalos de performance estão em outros locais, geralmente relacionados a I/O: Banco de dados, rede, leitura de arquivos. Existe problemas também por erros de software, como escolher a estrutura de dados errada.

No caso existem gargalos no Banco de Dados (que, aliás, são feitos em C ou C++), na conexão, leitura de arquivos. Assim toda a vantagem em performance do C++ se torna menos importante.

No caso do Twitter, veja essa página e perceba como eles usam, sim, C++ quando eles acham mais conveniente.

No caso eles estão migrando aos poucos toda sua plataforma , hoje é um emaranhado de solucoes juntas tentando driblar as dificuldades da opcao que eles fizeram (utilizar Ruby) para este projeto faraonico…

O que quero dizer que quanto mais a coisa aperta , mais eles estão correndo para a plataforma Java.
é só voce ler na linha do tempo… como eles iniciaram e aonde eles estão.

Voe leu quantos projetos eles tem C/C++ ? Por favor… um moduluzinho aqui , outro ali… coisa josé…
Viu a quantidade em Java e quantidade de coisas em Ruby ?

V

chun:
Idiota é a conclusao que quem lê esta thread chega… Aqui tem um monte de exemplos confusos e puxando cada um para sua sardinha…

A noticia que eu postei é um belo exemplo de um pessoal que antes tinha uma arquitetura dita “ideal aos projetos do novo milenio” e agora esta correndo dela… indo tudo para java…

Se voce analisar simploriamente o contexto da noticia vai chegar a esta sua conclusao… se voce perceber o que estou me referindo a PLATAFORMA e nao a apenas uma linguagem , ai voce percebe o que eu quero dizer

Quanto ao algoritimo nao me venha com churumelas… existem dezenas de aplicativos implementando MapReduce em C++… e mesmo assim optaram por Java.

O java, pelo que a notícia dá claramente a entender, é um detalhe menor. Não foi o fator de tomada de decisão. Optaram por essa tecnologia por ela ser melhor que a relacional e por ser livre. Não por ser feita em Java. Aliás, foram raras as vezes que sequer me perguntei em que linguagem um BD foi implementado ao escolhe-lo. Geralmente escolhemos um BD por outras características, como as citadas no artigo.

Além disso, discussões sobre que plataforma é melhor não estão no assunto dessa thread. Até então, ninguém quer convencer ninguém a usar Java ou C++. Estamos questionando sobre performance em Java. E, felizmente, a conclusão está sendo de que a performance da plataforma é excelente, e que são raras exceções, e bem específicas, onde alguém teria que investir em toda complicação do C++.

C

ViniGodoy:
chun:
Idiota é a conclusao que quem lê esta thread chega… Aqui tem um monte de exemplos confusos e puxando cada um para sua sardinha…

A noticia que eu postei é um belo exemplo de um pessoal que antes tinha uma arquitetura dita “ideal aos projetos do novo milenio” e agora esta correndo dela… indo tudo para java…

Se voce analisar simploriamente o contexto da noticia vai chegar a esta sua conclusao… se voce perceber o que estou me referindo a PLATAFORMA e nao a apenas uma linguagem , ai voce percebe o que eu quero dizer

Quanto ao algoritimo nao me venha com churumelas… existem dezenas de aplicativos implementando MapReduce em C++… e mesmo assim optaram por Java.

O java, pelo que a notícia dá claramente a entender, é um detalhe menor. Não foi o fator de tomada de decisão. Optaram por essa tecnologia por ela ser melhor que a relacional e por ser livre. Não por ser feita em Java. Aliás, foram raras as vezes que sequer me perguntei em que linguagem um BD foi implementado ao escolhe-lo. Geralmente escolhemos um BD por outras características, como as citadas no artigo.

É verdade ? E por que não uma implementacao do mesmo algoritmo em C++ ? ou C.
Eu sempre me pergunto em qual plataforma/e/ou/linguagem foi feito um pedaço tão importante de um aplicativo… é essecial para tomada de decioes como um todo.

ViniGodoy:

Além disso, discussões sobre que plataforma é melhor não estão no assunto dessa thread. Até então, ninguém quer convencer ninguém a usar Java ou C++. Estamos questionando sobre performance em Java. E, felizmente, a conclusão está sendo de que a performance da plataforma é excelente, e que são raras exceções, e bem específicas, onde alguém teria que investir em toda complicação do C++.

Opa ! Era isso que eu gostaria de ler da sua parte… quem lê todos os seus posts nesta thread não parece que voce tenha reconhecido isso.

V

Não mesmo? Então que tal ler esse post?
http://www.guj.com.br/posts/list/45/198295.java#996969

Ou esse aqui?
http://www.guj.com.br/posts/list/30/198295.java#996671

Ou ainda esse?
http://www.guj.com.br/posts/list/75/198295.java#997948

Eu só acho que o povo que curte Java também fala muita besteira em relação ao C++. Eu programo há vários anos nas duas linguagens, muitos deles com sistemas de tempo real. E as duas tem pontos fortes e fracos.

C

Não mesmo? Então que tal ler esse post?
http://www.guj.com.br/posts/list/45/198295.java#996969

Ou esse aqui?
http://www.guj.com.br/posts/list/30/198295.java#996671

Ou ainda esse?
http://www.guj.com.br/posts/list/75/198295.java#997948

Eu só acho que o povo que curte Java também fala muita besteira em relação ao C++. Eu programo há vários anos nas duas linguagens, muitos deles com sistemas de tempo real. E as duas tem pontos fortes e fracos.

Eu reconheco onde java perde feio… e que tem problemas SIM… mas a performance não é um destes problemas. Nao no hardware disponivel hoje em dia.

V

Aliás, o que geralmente estraga threads desse tipo é quando vem alguém com a postura que você adotou, chun. Ninguém está travando batalha entre linguagens, ou afirmando que C++ é melhor que Java.

Como já reconhecemos no início da thread, o C++ tem diversas desvantagens. Posso citar diversas delas:

  1. É extremamente complexo gerenciar memória em C++.
  2. O legado da linguagem tornou-a cheia de pequenas armadilhas;
  3. Existem menos profissionais qualificados e mais caros;
  4. É mais difícil obter softwares gratuitos em C++.
  5. Não é multi-plataforma.

O ponto 1 merece destaques com luzes coloridas. Quando falamos em extremamente complexo, estamos falando em uma dificuldade que se estende por toda aplicação. Smart Pointers atenuam o problema, mas não eliminam. Fora que tem uma sintaxe muito mais confusa e eliminam o comportamento determinístico do new e delete.

Por isso, como eu já falei no passado, acho que hoje só vale a pena usar C++ em aplicações onde você realmente precisa de performance crítica, num hardware específico, ou em aplicações onde as pausas do GC não possam ser toleradas. Não é o caso do BD do twitter, pois como já expliquei nessa thread, existem intervalos de tempo toleráveis para um BD muito superiores ao do GC, e existirão gargalos provavelmente tão ruins quanto a eventual diferença de processamento.

Agora, não é por isso que devemos dizer que o Java é a solução para todos os problemas. Tente fazer uma aplicação de vídeo em Java e você logo começa a sentir os pequenos congelamentos do gc. Em certos tipo de sistemas de tempo real, o buraco é bem mais embaixo. Felizmente, uma nova geração de GC está vindo por aí e, como eu mesmo publiquei o link, deve melhorar ainda mais o uso de java em aplicações de tempo real.

Então, se você está dizendo que eu dei a entender que o C++ é melhor em toda a thread, sugiro que você leia com cuidado os posts anteriores…

V

Você está falando do que? Sistemas comerciais comuns? Isso aí já foi dito umas 50 vezes na thread. Por mim, inclusive, que afirmei que na maior parte das aplicações comerciais hoje, quem culpa a linguagem por problema de performance é um mau programador.

Se você vai lidar com hardware específico, não vai ser num software de cadastro e relatório, muito provavelmente. Um dos exemplos citados é um sistema de suporte a vida, ou um sistema de telecomunicações, onde cada milissegundo pode ser precioso. Onde um GC não pode se dar ao luxo de congelar sua aplicação num momento completamente inesperado.

Então, muito provavelmente, você acabará desenvolvendo o hardware e o software para controlar esse hardware. Na Siemens, lidavamos com algumas centrais que precisavam processar centenas de pacotes por segundo. Em regime de pico, uma execução do garbage collector poderia ocasionar na perde de centenas de ligações telefônicas. Você realmente usaria Java, com um GC completamente imprevisível, nessa situação?

J

Não mesmo? Então que tal ler esse post?
http://www.guj.com.br/posts/list/45/198295.java#996969

Ou esse aqui?
http://www.guj.com.br/posts/list/30/198295.java#996671

Ou ainda esse?
http://www.guj.com.br/posts/list/75/198295.java#997948

Eu só acho que o povo que curte Java também fala muita besteira em relação ao C++. Eu programo há vários anos nas duas linguagens, muitos deles com sistemas de tempo real. E as duas tem pontos fortes e fracos.

Eu reconheco onde java perde feio… e que tem problemas SIM… mas a performance não é um destes problemas. Nao no hardware disponivel hoje em dia.

Você fala muito e prova pouco.
Em vez de falar poderia postar um exemplo aqui para esclarecer a todos. Pode ser exemplo de aplicação em tempo real como jogo, captura de vídeo, etc…

obs: Taikodon usa mapeamento para opengl(c++) e openAL(c++)

L

ViniGodoy:
Aliás, o que geralmente estraga threads desse tipo é quando vem alguém com a postura que você adotou, chun. Ninguém está travando batalha entre linguagens, ou afirmando que C++ é melhor que Java.

Como já reconhecemos no início da thread, o C++ tem diversas desvantagens. Posso citar diversas delas:

  1. É extremamente complexo gerenciar memória em C++.
  2. O legado da linguagem tornou-a cheia de pequenas armadilhas;
  3. Existem menos profissionais qualificados e mais caros;
  4. É mais difícil obter softwares gratuitos em C++.
  5. Não é multi-plataforma.

O ponto 1 merece destaques com luzes coloridas. Quando falamos em extremamente complexo, estamos falando em uma dificuldade que se estende por toda aplicação. Smart Pointers atenuam o problema, mas não eliminam. Fora que tem uma sintaxe muito mais confusa e eliminam o comportamento determinístico do new e delete.

Por isso, como eu já falei no passado, acho que hoje só vale a pena usar C++ em aplicações onde você realmente precisa de performance crítica, num hardware específico, ou em aplicações onde as pausas do GC não possam ser toleradas. Não é o caso do BD do twitter, pois como já expliquei nessa thread, existem intervalos de tempo toleráveis para um BD muito superiores ao do GC, e existirão gargalos provavelmente tão ruins quanto a eventual diferença de processamento.

Agora, não é por isso que devemos dizer que o Java é a solução para todos os problemas. Tente fazer uma aplicação de vídeo em Java e você logo começa a sentir os pequenos congelamentos do gc. Em certos tipo de sistemas de tempo real, o buraco é bem mais embaixo. Felizmente, uma nova geração de GC está vindo por aí e, como eu mesmo publiquei o link, deve melhorar ainda mais o uso de java em aplicações de tempo real.

Então, se você está dizendo que eu dei a entender que o C++ é melhor em toda a thread, sugiro que você leia com cuidado os posts anteriores…

Alias,

ao invés do pessoal ficar travando batalhas sobre qual linguagem é melhor, o pessoal deveria se atentar principalmente neste ponto que o Vini falou:

Java é melhor para as massas, pois existem um número elevado de profissionais, mas para uma pessoa física, tvz seja mais interessante ela trabalhar com C++, já que normalmente é um profissional mais caro!

D

ViniGodoy:
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…

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.

auhuaa… onde vc aprente tudo isso???

V

Um dos locais mais interessantes é o site da IBM. Dê uma olhada nos artigos do Brian Goetz link aqui.

Dos autores, ele certamente é um dos melhores.
No site do próprio Goetz há mais artigos:
http://www.briangoetz.com/pubs.html

Existem alguns livros especializados em performance e na linguagem em si.

Outra boa forte de informação é o site da própria Sun. Existem por lá diversos artigos sobre performance e ergonomia do garbage collector:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Sobre o novo garbage collector, tem um link também da Sun que passei num dos posts anteriores.

Me avise se você quiser links também para C++, mas a maioria do material está mesmo em bons livros.

Quando você trabalha com tempo real, é necessário ler muito e estudar muito as tecnologias envolvidas. Sistemas de tempo real geralmente vão explorar ao máximo os limites dessas tecnologias, o que não ocorre com outros tipos de sistema. Por isso, é bom se manter sempre informado, com artigos atualizados e, principalmente, com fontes confiáveis. Se você entrar no site javaperformancetuning.com, vai encontrar um monte de artigos sobre o assunto, mas a falta de critério do pessoal tornou esse site praticamente inútil, na minha opinião. Você vê por lá artigos sérios e mitos e fica difícil diferenciar um do outro.

J

Um dos locais mais interessantes é o site da IBM. Dê uma olhada nos artigos do Brian Goetz link aqui.

Dos autores, ele certamente é um dos melhores.
No site do próprio Goetz há mais artigos:
http://www.briangoetz.com/pubs.html

Existem alguns livros especializados em performance e na linguagem em si.

Outra boa forte de informação é o site da própria Sun. Existem por lá diversos artigos sobre performance e ergonomia do garbage collector:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Sobre o novo garbage collector, tem um link também da Sun que passei num dos posts anteriores.

Me avise se você quiser links também para C++, mas a maioria do material está mesmo em bons livros.

Quando você trabalha com tempo real, é necessário ler muito e estudar muito as tecnologias envolvidas. Sistemas de tempo real geralmente vão explorar ao máximo os limites dessas tecnologias, o que não ocorre com outros tipos de sistema. Por isso, é bom se manter sempre informado, com artigos atualizados e, principalmente, com fontes confiáveis. Se você entrar no site javaperformancetuning.com, vai encontrar um monte de artigos sobre o assunto, mas a falta de critério do pessoal tornou esse site praticamente inútil, na minha opinião. Você vê por lá artigos sérios e mitos e fica difícil diferenciar um do outro.

O que acaba com um bom artigo realmente é o mito. Um bom artigo deve possuir boa base teórica, e provas científicas(código fonte).
um lugar onde se presa o científico é o http://www.codeproject.com .
Além de teoria, nos mais diversos temas, você tem o código fonte para testar.

E

O java não é lento!

O que acontece é que, quando o Java estava apenas engatinhando, ele realmente tinha problemas de performance; mas todos esses problemas foram (e estão sendo) resolvidos. As pessoas pegaram esse vício de dizer isso, e agora ficam falando isso sem conhecimento de causa.

Quer ver o Delphi ser lento? É só colocar uma pessoa que não sabe programar fazer algo no Delphi.

Outra coisa: é possível encontrar vários artigos acadêmicos na internet dizendo que o Java não é lento: http://74.125.155.132/scholar?q=cache:uNiJvsyFkIYJ:scholar.google.com/+java+n%C3%A3o+%C3%A9+lento&hl=pt-BR&as_sdt=2000.

Até mais

M

Ultimamente essas discussões de linguagens tem sido um pé-no-saco…
Quem se acha “entendido” da coisa deveria perceber que linguagem é ferramenta para um objetivo, e não um fim em si mesma.
Acho que todo mundo aqui deveria ter noção de como levar uma conversa, na boa, sem stress.
Daí vem um bonito e diz agora: “Mas quem tá falando disso aqui?”
Bem, acho que o exemplo tem ser dado por quem já está no mercado e tem experiência há mais tempo.
Porque é um SACO, ficar nessas discussões sem fim, e que so demonstram a imaturidade de algumas pessoas.
Melhor agir com racionalidade, e se perder o fio da meada, ignorar os trolls…rs

J

eliangela:
O java não é lento!

O que acontece é que, quando o Java estava apenas engatinhando, ele realmente tinha problemas de performance; mas todos esses problemas foram (e estão sendo) resolvidos. As pessoas pegaram esse vício de dizer isso, e agora ficam falando isso sem conhecimento de causa.

Quer ver o Delphi ser lento? É só colocar uma pessoa que não sabe programar fazer algo no Delphi.

Outra coisa: é possível encontrar vários artigos acadêmicos na internet dizendo que o Java não é lento: http://74.125.155.132/scholar?q=cache:uNiJvsyFkIYJ:scholar.google.com/+java+n%C3%A3o+%C3%A9+lento&hl=pt-BR&as_sdt=2000.

Até mais

A discução aqui não é java ser lento ou rápido. É sobre quais tipos de aplicação java pode ser viável ou não.
Java é lento? Não, mas é inviável usá-la para aplicações criticas, pelas mais diversas razões já citadas aqui, e que faz o uso de c++ ser necessário em quase 30 anos.

Artigos acadêmicos servem para ser criticados, e provas empíricas não servem para nada. O ideal é nós mesmos experimentarmos as tecnologias através de testes e benchmarks, como os que o sergio postou.

A performance do java vem crescendo a cada versão, e hoje a diferença é mínima entre um assembly nativo e um bytecode, mas a melhor otimização é aquela que você tem total controle do fluxo do software, e, as vezes, um programa gerenciando seus objetos em memória é um empecilho muito grande.

Detalhe, a conclusão do artigo que postou refere c++ para o uso de aplicações de alta performance, e java para ganho de produtividade.

J

marcio.sancho:
Ultimamente essas discussões de linguagens tem sido um pé-no-saco…
Quem se acha “entendido” da coisa deveria perceber que linguagem é ferramenta para um objetivo, e não um fim em si mesma.
Acho que todo mundo aqui deveria ter noção de como levar uma conversa, na boa, sem stress.
Daí vem um bonito e diz agora: “Mas quem tá falando disso aqui?”
Bem, acho que o exemplo tem ser dado por quem já está no mercado e tem experiência há mais tempo.
Porque é um SACO, ficar nessas discussões sem fim, e que so demonstram a imaturidade de algumas pessoas.
Melhor agir com racionalidade, e se perder o fio da meada, ignorar os trolls…rs

O problema é a parcialidade, ou seja, o que eu uso é melhor. Até alguns posts atrás, o debate estava muito bom.

M

juliocbq:
marcio.sancho:
Ultimamente essas discussões de linguagens tem sido um pé-no-saco…
Quem se acha “entendido” da coisa deveria perceber que linguagem é ferramenta para um objetivo, e não um fim em si mesma.
Acho que todo mundo aqui deveria ter noção de como levar uma conversa, na boa, sem stress.
Daí vem um bonito e diz agora: “Mas quem tá falando disso aqui?”
Bem, acho que o exemplo tem ser dado por quem já está no mercado e tem experiência há mais tempo.
Porque é um SACO, ficar nessas discussões sem fim, e que so demonstram a imaturidade de algumas pessoas.
Melhor agir com racionalidade, e se perder o fio da meada, ignorar os trolls…rs

O problema é a parcialidade, ou seja, o que eu uso é melhor. Até alguns posts atrás, o debate estava muito bom.

Concordo.

B
ViniGodoy:
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.

cara, não resisti :) e acabei fazendo a experiência que vc citou. no meu benchmark o java levou o dobro do tempo que o c++. segue o código que usei:

#include <iostream>
#include <time.h>
using namespace std;

class Point {
	public:
		Point();
	private:
		double x;
		double y;
	};

Point::Point() { x = 0; y = 0; }

int main(){
	cout << "creating objects...\n";
	time_t secondsStart = time (NULL);
	for (long i = 0;i < 100000000; i++)
		Point p();
	time_t secondsEnd = time (NULL);
	printf ("%ld seconds to create objects.\n", secondsEnd-secondsStart);
	return 0;
}
class Point {
	private double x;
	private double y;
	
	public Point() {
		x = 0;
		y = 0;
	}
}

public class Main {
	public static void main(String[] args) {
		System.out.println("creating objects...");
		long milesecondsStart = System.currentTimeMillis();
		for (long i = 0; i < 100000000L; i++)
			new Point();
		long milesecondsEnd = System.currentTimeMillis();
		System.out.printf("%d seconds to create objects.", (milesecondsEnd-milesecondsStart)/1000);
	}
}
Mesmo java sendo mais lento, achei incrivelmente rápido. Porém posso ter deixado alguma coisa passar ou entendido errado. O tipo de comparação que vc se referia era essa?
V

marcio.sancho:
Ultimamente essas discussões de linguagens tem sido um pé-no-saco…
Quem se acha “entendido” da coisa deveria perceber que linguagem é ferramenta para um objetivo, e não um fim em si mesma.
Acho que todo mundo aqui deveria ter noção de como levar uma conversa, na boa, sem stress.
Daí vem um bonito e diz agora: “Mas quem tá falando disso aqui?”
Bem, acho que o exemplo tem ser dado por quem já está no mercado e tem experiência há mais tempo.
Porque é um SACO, ficar nessas discussões sem fim, e que so demonstram a imaturidade de algumas pessoas.
Melhor agir com racionalidade, e se perder o fio da meada, ignorar os trolls…rs

A discussão é importante pq ela pode determinar qual ferramenta usar em cada caso. O problema justamente acontece quando alguns programadores tentam apertar um prego com uma faca e comer usando chave de fenda!

V

Você criou o Point no stack e não no heap. Faça:

for (long i = 0;i < 100000000; i++) { Point* p = new Point(); delete p; }

O stack é mesmo incrivelmente rápido.

Mas isso só reforça a conclusão que eu queria chegar. O Java e o C++ tem ergonomias completamente diferentes. Por isso, é dificílimo dizer qual vai gerar uma aplicação mais lenta ou mais rápida sem muito benchmark. Além disso, em 99.9% dos casos, a diferença será irrelevante, pois os gargalos da aplicação não estarão na linguagem e sim em BD, I/O, rede, etc…

V

Acabei de fazer o bechmark alterando no C++ para criação com new e delete (como eu tinha sugerido).

No java: 1 segundo
No C++: 16 segundos (otimização O3 ligada).

Essa criação de objeto é meio estúpida, mas você tem que considerar que isso poderia estar num método:

void Mesh::doSomething() {
   Point p* = new Point();
   //faz qualquer coisa com p
   delete p;
}

E seu loop poderia estar chamando doSomething(), sem nem saber dessa criação/destruição no heap.

PS: Eu adoro esse benchmark, sempre uso em discussões de fóruns de C++ quando falam que o Java é mais lento “no geral”.

J

Você criou o Point no stack e não no heap. Faça:

for (long i = 0;i < 100000000; i++) { Point* p = new Point(); delete p; }

O stack é mesmo incrivelmente rápido.

Mas isso só reforça a conclusão que eu queria chegar. O Java e o C++ tem ergonomias completamente diferentes. Por isso, é dificílimo dizer qual vai gerar uma aplicação mais lenta ou mais rápida sem muito benchmark. Além disso, em 99.9% dos casos, a diferença será irrelevante, pois os gargalos da aplicação não estarão na linguagem e sim em BD, I/O, rede, etc…

Isso, a stack é uma área da memória usada para variáveis(alocadas estaticamente em memoria), objetos alocados dinamicamente vão para o heap. A stack do windows xp suporta 8mb;
se você alocar um vetor maior que, o programa nem inicializa.

Outra maneira de otimizar esse código seria transformar Point em uma struct, dessa maneira certificando-se que sempre estaria na stack.

#include <QtCore/QCoreApplication>
#include <iostream>
#include <time.h>
#include <stdio.h>

using namespace std;

struct Point {
        double x;
        double y;
    };

//Point::Point() { x = 0; y = 0; }

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cout << "creating objects...\n";
    time_t secondsStart = time (NULL);

    for (long i = 0;i < 100000000; i++)
            struct Point p;

    time_t secondsEnd = time (NULL);

    printf ("%ld seconds to create objects.\n", secondsEnd-secondsStart);

    return a.exec();
}

Aqui já levou milisegundos.


J

aqui um exemplo com c#

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

namespace csharpbench
{
	
	
	class MyPoint{
		double x;
		double y;
	};
	
	class Program
	{

		static MyPoint p;
		static bool x;
		public static void Main(string[] args)
		{
			Stopwatch s1 = Stopwatch.StartNew();
			for (long i = 0;i < 100000000; i++){
				p = new MyPoint();
			}
			
			s1.Stop();
			Console.WriteLine(s1.ElapsedMilliseconds);
			Console.ReadKey(x);
		}
		
	}
}

saída: 3.846 ms

Aqui usando a stack:

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

namespace csharpbench
{
	
	
	class MyPoint{
		double x;
		double y;
	};
	
	class Program
	{

		static MyPoint p;
		static bool x;
		public static void Main(string[] args)
		{
			Stopwatch s1 = Stopwatch.StartNew();
			for (long i = 0;i < 100000000; i++){
				MyPoint p;
			}
			
			s1.Stop();
			Console.WriteLine(s1.ElapsedMilliseconds);
			Console.ReadKey(x);
		}
		
	}
}

saida: 0.542 ms

Pode ser otimizado usando unsafe, e gerenciando memória manualmente, em determinados blocos

A

Julio, eu não entendi este seu ultimo exemplo com C#, quando dentro do for vc faz o

MyPoint p;

Vc não esta alocando um objeto MyPoint na stack igual vc estaria fazendo com C++, tanto é que se vc colocar um

MyPoint p;
Console.WriteLine(p.GetHashCode());

O compilador vai chorar dizendo “Use of unassigned variable p”

O que parece é que vc declarou um ponteiro vazio, não sei se da para usar isto como comparação não.

J
ovelha:
Julio, eu não entendi este seu ultimo exemplo com C#, quando dentro do for vc faz o
MyPoint p;

Vc não esta alocando um objeto MyPoint na stack igual vc estaria fazendo com C++, tanto é que se vc colocar um

MyPoint p;
Console.WriteLine(p.GetHashCode());

O compilador vai chorar dizendo "Use of unassigned variable p"

O que parece é que vc declarou um ponteiro vazio, não sei se da para usar isto como comparação não.

Você tem razão.
Esqueci de mudar a class para struct no código. p está null.
Correção:

Aqui p está constantemente alocado na stack, e dá para observar a diferença

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

namespace csharpbench
{
	
	

	class Program
	{
		struct MyPoint{
			public double x;
			public double y;
		};
		
    	        static bool x;

		public static void Main(string[] args)
		{
			Stopwatch s1 = Stopwatch.StartNew();

			for (long i = 0;i < 100000000; i++){
				
				MyPoint p;
				p.x = 0;
				p.y = 0;
				
			}
			
			s1.Stop();
			Console.WriteLine(s1.ElapsedMilliseconds);
			Console.ReadKey(x);
		}
		
	}
}

saída: 0.688 ms

B

Não pude deixar de ver este tópico que é bem interessante e que não leva a lugar nenhum… :smiley:

Código abaixo em C++: 6 seg
Equivalente em Java : 13 seg.

char * raw_mem = new char [sizeof (Point)];
     for (long i = 0;i < [telefone removido]; i++) {
          Point * x = new (raw_mem) Point(0.0, 0.0);
          x->setX(23.98);
          x->~Point();
     }
    delete[] raw_mem;
T

Você ta chamando o destrutor explicitamente? =Z
Quando fiz isso na faculdade tomei uma bronca do professor que nunca mais ousei fazê-lo novamente hehehe.
O correto não seria um:

delete x;
 x = NULL;

?

V

Aqui ele mostra o que eu quero dizer com C++ mais otimizável. No C++, você pode fazer seu próprio gerencimento de memória, tanto que ele tentou emular o que o garbage collector já faz nativamente (não apagar a área de memória reservada).

No C++, o correto não seria fazer desse jeito e sim sobrescrever o new e o delete (mas entendo o benchmark feito dessa forma por questões de simplicidade). Agora, isso não é fácil, e o código do colega mostra que a otimização já começou a gerar um programa consideravelmente mais rebuscado. Já seria mais difícil achar gente que sabe fazer algo assim e mais caro manter esse código. Essa otimização também seria impossível caso o objeto tivesse sido criado dentro de um método, como eu sugeri ali em cima, e é sempre existente no Java.

Agora, você diz que o equivalente em Java levou 13 segundos. Qual foi o seu “equivalente em Java”? O código equivalente mais simples e direto é o postaram ali atrás, e na minha máquina levou pouco mais do que meio segundo.

J

Tchello:
Você ta chamando o destrutor explicitamente? =Z
Quando fiz isso na faculdade tomei uma bronca do professor que nunca mais ousei fazê-lo novamente hehehe.
O correto não seria um:

delete x;
 x = NULL;

?

Você tem razão. O delete só limpa a área de memória, mas o apontador continua apontando para a area

x---->> 0x???

se x receber null, o ponteiro perde a referencia. É a forma correta de se fazer.

V

Tchello:
Você ta chamando o destrutor explicitamente? =Z
Quando fiz isso na faculdade tomei uma bronca do professor que nunca mais ousei fazê-lo novamente hehehe.
?

Ele chama o destrutor e o construtor explicitamente pois só está interessado no que eles fazem (zerar as variáveis, limpar o ambiente), não na reserva e limpeza da memória. Isso é feito explicitamente por ele, na alocação e desalocação daquele array, e apenas uma vez, antes e depois do for.

V

Uma coisa interessante aqui. Veja o esforço que estamos fazendo para tentar chegar a um código mais otimizado que o do GC. E mesmo o exemplo extremo do colega ainda levou 6 segundos, contra apenas 1 do Java.

O mais rápido mesmo é alocação e desalocação no stack. Porém, para o programador java, esse gerenciamento é feito de forma transparente, rápida e eficiente pelo gc. Ele em momento nenhum precisou se preocupar com isso ou comprometer a legibilidade do próprio código.

Entretanto, no C++, foi possível chegar a uma solução mais rápida. Poderíamos mesmo sobrescrever o new e o delete, fazer um memory manager otimizado exclusivamente para a classe point, alinhado até mesmo com detalhes de nosso processador. Seria caro, custaria esforço, mas seria possível. Se é viável ou não, só o nosso negócio poderá dizer, mas já vi casos disso na indústria de jogos, por exemplo.

T

Entendi agora Vini.
Tem muito tempo que não programo em C++ e quando o fiz foi em projetos puramente acadêmicos e nada muito complexo.

Abraços.

J

o tipo auto_ptr da biblioteca( #include<memory.h> ) padrão implementa um coletor de lixo automatico, mas não é robusto como o gc do java pelas experiências que tive.

auto_ptr<Pointer> point(new Pointer());

A performance cai consideravelmente. Mas acredito que os smart pointers da boost sejam mais otimizados.

V

São sim, além de existirem vários tipos de Smart Pointer na boost, o shared_ptr e o scoped_ptr parece que irão entrar na próxima versão do C++.

Criado 15 de fevereiro de 2010
Ultima resposta 2 de mar. de 2010
Respostas 149
Participantes 47