logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog


Um bom exemplo de comparação de performance entre linguagens/runtimes

Vou reproduzir aqui um comentário que vi no Slashdot, em um post que falava de uma discussão sobre a segurança da JVM e do .NET, envolvendo o Don Box:

You're quite right that Java's speed is excellent these days (for non-GUI code, at least). I've spent a lot of time recently working with a large system that was first implemented in Java (by highly skilled developers) and then ported to C++ (by greenhorns). The C++ port is only 50-100% faster, which isn't worth the price in developer time that's been wasted on memory leaks and other forms of memory corruption that were never a factor in Java. Besides that, supporting multiple platforms with the C++ version is the #definition of pain. However, the C++ version uses only about 1/4 or 1/5 as much memory as the Java version, and starts up far more quickly. If a *desktop* application needs to be deployed on older machines, or if the application is so memory-intensive it taxes the limits of today's server hardware, Java still falls flat.

Grifei as partes que achei mais importantes. Ah, e antes que você vá procurar em um dicionário, eu já fiz - greenhorn quer dizer "iniciante".

Vamos aos fatos:

Uma aplicação feita por programadores experientes em Java, quando portada para C++ por programadores novatos e inexperientes ficou (só) 50-100% mais rápida. Ok, eu prometo que vou parar de ficar repetindo que o C++ é muito mais rápido que ambientes gerenciados. Mas eu juro que só faço isso porque existem pessoas (principalmente aqui no Brasil) que ainda teimam em dizer o contrário. Agora imagine uma aplicação portada por programadores experientes...

Mesmo com o ganho de performance não valeu a pena, já que os memory leaks e erros de memória corrompida nunca aconteceriam em Java. Concordo plenamente. Os ambientes gerenciados foram criados para não deixar que esses erros aconteçam. Quando a performance não é o mais importante, faça em Java/.NET. Um programador inexperiente Java/.NET vai fazer um aplicativo lento que consome muita memória. Um programador inexperiente C/C++ vai fazer um aplicativo que dá GPF por qualquer coisa.

A versão C++ consome de 1/4 a 1/5 da memória consumida pelo aplicativo Java e inicia muito mais rápido. Esse é um dos problemas dos ambiente gerenciados, o consumo de memória. Experimente usar a extensão SOS (Sons of Strike, para debug da CLR) do WinDbg, e faça um dump de todos os objetos no heap do Garbage Collector. Você vai entender... A grande vantagem é que, apesar do consumo médio de memória ser alto, ele tem um limite no decorrer da vida do aplicativo, já que o GC recolhe todos os objetos. Já em C/C++, se sua aplicação aloca bastante memória e não desaloca, uma hora ela esgota a memória da máquina. Como sempre, em C/C++, você tem que saber o que faz e fazer direito (mais do que em ambientes gerenciados).

Esse é o tipo de comparação de performance que eu acho válida. Faça um aplicativo, de no mínimo de médio porte, e compare. Comparar performance de "Hello World"s e outras coisas simples não indicam muita coisa útil. Um exemplo: a alocação de memória em ambiente com GC é mais rápido do que em C/C++, já que envolve somente uma soma de ponteiro. A alocação em C/C++ envolve algoritmos de heap, mais complicados e demorados. E isso não faz os ambientes gerenciados mais rápidos.

Resumindo: cada ferramenta tem seu propósito (eu já disse isso várias vezes, não é?). Se o aplicativo citado fosse feito por programadores C++ experientes, ele talvez seria 300% mais rápido e consumiria 1/10 de memória. Parece óbvio fazer em C++ não? Mas não é. Talvez a empresa gaste menos pagando programadores Java e comprando mais 3 servidores. Nem sempre performance e baixo consumo de memória é o foco. Se fosse, estaríamos usando DOS até hoje...


Em 08/02/2005 01:19, por Rodrigo Strauss


  
 
 
Comentários
Fabio Galuppo | website | em 08/02/2005 | #
Como diria meu amigo Rogério Wagner: "Existem aqueles que nasceram para gerenciar e outros que nasceram para ser gerenciados". Ele faz a analogia q em C++ vc é dono de tudo - e fique bem claro - se fizer m****, foi vc que fez! Por outro lado num ambiente com VM vc tem algumas "garantias", porém muitas vezes o programador gerenciado necessita saber e interagir com um recurso não gerenciado ou até mesmo com um recurso escasso. Mas é isto ai, no dia a dia, eles fazem a m**** e nós arrumamos :)

Rodrigo Strauss | website | em 08/02/2005 | #
Muito boa essa! Não me dê mais munição, tenho medo de não me controlar :-)

Acho que eu me encaixo nas "pessoas que nasceram para gerenciar, mas optam por serem gerenciadas algumas vezes por comodidade".
Guilherme Campos | em 09/02/2005 | #
Parabens, gostei muito do seu blog... uma pena que ele não é atualizado com muita frequencia... =(
Gomes | em 10/02/2005 | #
Coloquei aqui já faz um tempão:

http://www.msdnbrasil.com.br/forum/ShowPost.aspx?PostID=1250...

Gráficos comparativos:

http://kano.net/javabench/data


Tá afim de refazer os testes pra Visual C++.Net, ;-P



Rodrigo Strauss | website | em 10/02/2005 | #
"Comparar performance de "Hello World"s e outras coisas simples não indicam muita coisa útil."
rebarba rebarba
  ::::