Rendimiento C++/C#/Java en Windows y Linux
He leído en el CUJ de Julio (C/C++ Users Journal) un artículo intitulado Micro Benchmarking C++, C#, and Java (sólo pasando por caja), lo que traducido al castellano podría ser algo así como “Pruebas de micro rendimiento para C++/C# y Java”.
El artículo es bastante corto y escueto; el autor indica qué elementos de juicio ha decidido, el hardware y las versiones de las herramientas. Los ensayos consisten en pruebas repetidas con pequeños bloques de código, como operaciones con enteros, en coma flotante, matrices, ordenación, instanciación, excepciones, tablas de dispersión y cosas así.
Este señor ha ejecutado los programas en Linux (Sun java 1.4.2 y 1.5, gcc, intel c, mono) y en Windows XP+SP2 (SUN java 1.4.2, java 5, net 2, net 1.1sp1, ms c++ 7.1). Las versiones java han sido verificadas tanto en el lado cliente como en el servidor.
Personalmente considero que, dado lo delicado del tema, el artículo es todo lo serio que puede ser.
RESULTADOS
En contra de mi opnión personal, y creo que en la de muchos, lo más destacable es la velocidad de Java, comparable a la de C++, tanto en ambas plataformas (excepto en rendimiento con operaciones de enteros del lado cliente, cosa que no entiendo) como en forma cruzada. Tan sólo tarda unos pocos milisegundos más en hacer las cosas. El .NET en general se queda después de Java (salvo excepciones con un rendimiento igual al ms c++ 7.1).
El ganador indiscutible es el GCC bajo Linux, que supera en rendimiento al C++ de Microsoft en casi todo (qué lástima que el autor no haya probado el gcc-win32), y el perdedor indiscutbile es Mono 1.0.6, con el peor rendimiento en casi todo (incluso dos y tres veces más lento que el más lento), seguido del lado cliente de Java, aunque sólo a veces.
TERRA INCOGNITA
Sabemos que Java es lento. No hay mas que instalar Eclipse para darse cuenta de ello. O cualquier otra aplicación grande. En mi experiencia personal es más lento que el .NET, por lo menos la sensación del usuario es esa. Sin embargo, en estos tests de rendimiento, gana. Y no es un problema de consumo de memoria, porque si tienes memoria suficiente (1,5 GB en mi caso), también lo es (me refiero con esto a que no tira de archivo de paginación, por lo que todo el asunto queda entre la RAM, la MMU y el procesador).
¿Dónde está, pues la lentitud en Java?

Seguramente uno de los problemas de Java viene de las clases que trae, que no son todo lo eficientes que deberían, en especial las Swing de dibujo de controles.
Yo hice unas pruebas muy simples (sin considerar Java): http://guti.bitacoras.com/index.php?entry=entry041103-153357, y .NET era bastante más lento que VC++.
Es una lástima que en este artículo no se haya contemplado el que creo sería el líder con diferencia: Intel C++ 9, tanto para Windows como para Linux.
Comment by Guti — June 22, 2005 @ 11:49 am
Java lento?
Leo en Diario de un Programador un post acerca del artículo Micro Benchmarking C++, C#, and Java (publicado en la revista “C/C++ Users Journal”), en el que el autor realiza pruebas de rendimiento con dichos lenguajes.
Al parecer (y d…
Trackback by Aprendiendo de la vida — June 23, 2005 @ 9:09 pm
Bueno dejenme comentarles yo he aprendido c++ y programado en el durante algo asi como 3 años y hace como 3 meses he empezado a aprender java, creo que se me ha hecho facil por la gran similitud entre estos, pero bueno a lo que voy es que no se como llega a esos resultado el tipo de la revista, en general en todas las aplicaciones que hecho que consumen muchos recursos, (en mi caso particular: que usan recurrencia o crean pilas de ejecucion) mi impresion general es que java es bastante mas lento.
Para ser mas especifico hice un programa hace mucho que analizaba una secuencias de caracteres y te los escribia en pantalla en todas las ordenaciones posibles, ejemplo:
Entrada :
abc
Salida :
abc
acb
bca
bac
cab
cba
este programa lo hice en borland c++; la semana pasada hice un programa en java que hace algo muy parecido, tiene 7 datos de entrada (todos los pido con comboboxes, lo que quiere decir que son datos validos y que no puede poner el usuario lo que el quiera sino solo los definidos en el programa), en cada combobox pongo una opcion llamada “NPI”, es decir si en ese combobox no sabe que informacion poner el programa intentara verificar con todos los datos posibles para esa entrada.
Lo estoy releyendo y parece algo un poco complicado de entender pero creo que se aclara la similitud si pongo un ejemplo, lo hare con 3 datos de entrada:
entrada:
d1 NPI d3
dadas esas entradas el programa generara lo siguiente
d1 d21 d3
d1 d22 d3
d1 d23 d3
.
.
.
d1 d2n d3
donde n es el numero de datos definidos para ese campo (campo 2), entonces si las entradas fueran:
d1 NPI NPI
dadas esas entradas el programa generara lo siguiente
d1 d21 d31
d1 d21 d32
.
.
.
d1 d21 d3m
d1 d22 d31
.
.
.
d1 d22 d3m
.
.
.
d1 d2n d3m
donde n es el numero de datos posibles para el campo 2 y m es el numero de datos posibles para el campo 3; como ven es algo similar, pues bien este programa con hacer poco mas de 5000 combinaciones se tardaba poco menos de 1 minuto, cuando en el programa anterior que hice c++ hacer las 5000 combinaciones era casi instantaneo.
Ahora debo decir que como soy nuevo para java tal vez mi codigo no este muy depurado (o deberia decir optimizado?) pero creo que con este ejemplo se ve muy claro que c++ es bastante mas rapido java, yo lo que creo es que el uso de apuntadores (cosa muy practica en c++ para utilizar memoria dinamica y estructuras de datos dinamicas) es bastante mas rapido, que la declaracion de objetos en java y su instanciacion con new y sus constructores.
Bueno esa es mi opinion personal y solo me baso en experiencia propia, si alguien tiene informacion al respecto o solo desacuerda conmigo por razones validas le agradeceria se comunicara conmigo por mail, ya que me interesa mucho el tema ya que por todo lo que he oido y leido ponen a java como lo mejor del mundo de la programacion y por mis experiencias meramente empiricas me siento un tanto desconfiado.
gggod32@yahoo.com
Saludos
Comment by TG_Cid — April 5, 2008 @ 6:24 am