domingo, 15 de julho de 2007

Java e C++ Benchmark

Devido ao fato de muitos amigos c-maniacs ficarem, ainda nos dias de hoje, baseando suas opiniões sobre Java nas velhas VM's 1.3-1.4 (no melhor dos casos), resolvi escrever este post. Não, não sou eu quem farei os benchmarks, mas fiz uma simples pesquisa no google sobre "c +java +benchmark" e dei uma lida em alguns artigos que falam sobre este tema, alguns de versões um pouco mais antigas da VM e outros sobre versões mais novas (1.5+).

Sei que este assunto é muito delicado e nada é decisivo, existem muitas variantes a serem consideradas e existem muitos testes diferentes. Mas o que realmente vemos, se quisermos ver é claro, é que o Java HOJE não é mais igual aquele antigo Java 1.1 de que tantas pessoas baseiam suas opiniões.

Well "Talk is cheap. Show me the code."

Antes de mais nada, vamos lembrar que não adianta querermos comparar um C com Java, mas sim C++ com Java, e é isso que a maioria destes benchmarks faz.

Para começar, utilizo o recente post de Paul Buchheit (criador e Lead Developer do Gmail), onde o primeiro parágrafo do seu post ele diz:

"A lot of people seem to be taking this post to be the "Ultimate C vs Java shootout". It's not. Performance is a very complex topic. My only real point is this: Java (which used to be slow) has reached the class of "fast languages". For the majority of applications, speed is no longer a valid excuse for using C++ instead of Java."
Em suma, ele diz que não é sua pesquisa o ultimato neste assunto de benchmark, mas que Java hoje, está na classe das "Linguagens Performáticas" e que "Velocidade ou Performance" não é mais desculpa para usar C++ ao invés de Java.

Ainda no post de Paul Buchheit, ele ressalta, que muitos testes atualmente contam o tempo de "start up" da VM como tempo de processamento, e simplesmente o que ele fez, foi fazer a iteração 3 vezes para cada código, e isto fez com que Java, fosse um pouco mais rápido que C na segunda e na terceira iteração.

Outro site que achei interessante, e que já tinha visto a uns 2 anos atrás, é este e ele tem um gráfico (abaixo) bem legalzinho sobre o desempenho em várias coisas, e isto usando a VM 1.4.2.



Outro ótimo artigo, que recomendo a leitura, é o do J.P.Lewis and Ulrich Neumann, onde além de colocar seus resultados, ainda desmistificam algumas coisas como:

1. GC is it worse... or better?
2. Run-time Compilation
3. Why is "Java is Slow" so Popular?

Não usei mais sites, porque acho que estes 3 satisfizeram minha idéia. Apesar de que em cada link deste post, existem muitos outros links para outros artigos sobre benchmark. E algo importante a ressaltar é "Não tome por verdade apenas 1 estudo sobre benchmark".

Concluindo, este não é um post que porá fim a questão, mas ao menos tenta abrir um pouco a mente dos "bitolados". Parar no tempo não é nem um pouco bom, ainda mais na nossa área. Entretanto, este também não é um post para dizer "Larguem C++ usem Java e sejam mais felizes", existe sempre a melhor escolha, e é impossível escolher o melhor caminho numa bifurcação se você só conhece um dos caminhos.

6 comentários:

Anônimo disse...

O problema é que Java é rápido às custas de 2 a 5 vezes mais uso de memória. E tanta memória causa mais swap em disco. Que causa lentidão. Some a isso o tempo de inicialização, e as lentas interfaces gráficas, a impressão final continua que Java é lento.

A propósito: Sim eu programo em C e C++, hehe. Para linguagem interpretada, prefiro Python e Lua.

Juliano Carniel (Jujo) disse...

Nos dias de hoje não creio que Memória seja realmente um agravante.
Botar um servidor rodando com 16GB de memória é fácil, então SWAP é praticamente inconcebível.

Mas agora, se vc está falando de Swing e rodando em uma máquina de usuário, ai eu concordo realmente contigo. É LENTO e o pior, é FEIO! Mas mesmo assim existem alternativas a isso, como SWT por exemplo, pra quem usa o Eclipse sabe que ele não é nem um pouco lento por rodar em Java.

Mas outro ponto importante a ressaltar, é que estamos falando de Swing até agora, e não de Java realmente. Sistemas rodando em Java em servidores web por exemplo, não é lento. Java rodando como sistemas Back-end em servidores, fazendo billing, processando requisições diversas, para isso ele não é nem um pouco lento.

Então vamos combinar que temos que falar da linguagem como um todo, e não somente da pior parte dela. =)

Anônimo disse...

Pois é, Java tem umas partes lentas e outras rápidas (bem rápidas, admito).

Pelo menos da última vez que testei, o Python dava a impressão de ser muito mais rápido. Era só salvar o arquivo e executá-lo diretamente! Interfaces gráficas, seja com o wxWidgets ou o feio Tk respondem rápido.

Já o Java, quando tu vai executar o compilador ou o programa, tinha sempre uma "travadinha" antes de executar o comando, principalmente na primeira vez! Algo do tipo "ls/dir", "mkdir" não poderia ser implementado em Java. Uma interface em SWT realmente é bem melhor do que em Swing, já comprovei! Mas não pude ver se essa diferença é grande (mas era perceptível da última vez que mexi)

Mas é só botar os 2, Java e Python, pra rodar um benchmark, que a gente vê que o Python é mil vezes mais lento. O Java agüenta criar muito mais objetos e fazer mais chamadas e iterações nos algoritmos do que o Python. Parece que Java foi feito pra rodar benchmarks... E sistemas back-end em servidores, claro! hehehe. Todo esse processo de JIT pra deixar mais rápido, desde que o programa seja daquele tipo que se beneficia desses recursos. Se o programa não puder tirar proveito disso (algo do tipo "ls"), não fica muito bom.

Na minha experiência, java era lento até aí pela versão 1.3. Foi aí que eu mudei de computador e deixei de perceber isso como um problema :-P

Mesmo assim, eu ainda acho que ele consome muita memória e dá uma impressão mais lenta do que o desejável. Se o programa Java for uma das poucas coisas que o computador/servidor em questão estiver fazendo, não tem problema.
Mas ficaria difícil se todos os programas que eu abro no meu desktop fossem Java.

Juliano Carniel (Jujo) disse...

=) Concordo contigo.
Mas como eu sempre digo, é bom conhecer os dois caminhos de uma bifurcação.
Realmente java não é muito bom para aplicações desktop, nem perto disso, e também não compensa o seu uso para coisas triviais como o seu exemplo "ls".
Tem que saber medir o seu uso, e saber onde aplicá-lo, mas no meu caso, aplicações que eu faço, são sistemas web, beck-end, batchs, etc, então acaba sendo que o java ajuda muito, e todos os recursos que ele me disponibiliza são quase todos usados.
Mas como tem sido divulgado muito por ai, mesmo sistemas web pequenos em java não compensa muito, tai o Ruby para suprir as necessidades =)

Uma coisa boa e ao mesmo tempo ruim do java é seus milhares de frameworks... bah, as vezes até enche o saco, e sempre me vem na cabeça a "Fábula dos Porcos".

Valeu

Anônimo disse...

"Seus milhares de frameworks"

Verdade!!! Eu gosto muito de aprender linguagens, por isso eu acho (achava) que sei Java. Mas não sou muito chegado em aprender frameworks a menos que a necessidade seja real. Simplesmente não acho muito interessante e, principalmente, não dá pra aprender nada apenas lendo, tem que usar! Nem sempre eu tenho um mini-projeto pra aplicar os conceitos do framework.

Por isso, muitas vezes fico com a sensação de que não sei **nada** sobre Java! Todo mundo fala de Hibernate, Spring, Struts, Tomcat, EJB, J2EE e tudo o que eu já fiz foi um minúsculo trabalho com um J2EE onde não deu nem pra entender a necessidade de tanta configuração, XMLs, interfaces, JARs e WARs pra fazer o treco rodar.

edu500ac disse...

A maior parte das pessoas utiliza o site Computer Language Benchmarks Game para comparar linguagens. Os programas utilizados são de tamanho médio e tratam de algoritmos tradicionais de bioinformática, física e estrutura de dados. Lá o Java 6 Server é uma das linguagens compiladas de pior desempenho. Fica atrás até mesmo das carroças tradicionais como LISP, uma linguagem que não pode utilizar declarações para otimização. Se for levado em conta o uso da memória, Java fica em último lugar, perdendo até para Fortran. Na realidade, com programas maiores, o desempenho de Java é até pior. Veja o caso do Azureus: Que carroça; e foi escrito em Java. Comparemos Java com Clean, por exemplo. Java chega ser de 1.6 a 65 vezes mais lenta; e utiliza de 5 a 20 vezes mais memória. Quero observar que este uso intensivo de memória, em problemas grandes, faz Java ser muito mais lento do que estes benchmarks parecem indicar. Resumindo, Java é uma carroça. Qualquer artigo que diga o contrário está utilizando benchmarks polarizados. Parecem aqueles benchmarks do Lisp, que usavam estrutura de dados e cálculo numérico intensivamente, para mostrar que Lisp era rápido. Mas Lisp conseguia ganhar pelo menos nestas coisas especializadas; Java nem isto.