<$BlogRSDUrl$>

Esos aparatos del demonio

Mis notas sobre lo que voy leyendo de ordenadores y periféricos

jueves, octubre 20, 2005

Leyendas urbanas sobre la velocidad de Java 


En este artículo sobre leyendas urbanas sobre la velocidad de Java explican cosas curiosas como:

- Es más rápido un new en Java (10 instrucciones máquina en las implementaciones actuales) que un malloc en C (entre 60 y 100 instrucciones).

- Programas como Ghostscrip y Perl gastan (o malgastan) hasta entre un 20 y un 30 por cierto de su tiempo en malloc y free.

- La gestión dinámica de memoria con el recolector de basura es más rápida que con malloc y free: mientras estos últimos van tratando los bloques uno a uno, el recolector de memoria trata varios de golpe. Como justificación, este estudio dice que reemplazó los asignadores de memoria de C++ por un recolector de basura y muchos programas pasaron a ir más rápido.

También es muy interesante el fragmento respecto a C++ donde explica por qué es más rápido usar la pila que el heap para poner objetos.

Lo que muestra el artículo es que se ha hecho mucha investigación en este campo y que las máquinas virtuales de ahora no son como las de 1995, así que mejor no seguir manteniendo las leyendas urbanas.

Como sé que hay gente que no estará de acuerdo con esto, aquí va un artículo que cuenta cuándo el C es la mejor herramienta. La verdad es que a mí no me ha convencido y algunas de sus afirmaciones respecto a Java (desventajas por no usar macros y problemas de fallos de caché por culpa del consumo de memoria) se ven rebatidas en el otro artículo. Y además, ¿seguro que la eficiencia es importante en el programa que pone de caso de estudio: un resolvedor de juego de cartas? ¿Seguro que merece la pena tener código que usa/abusa de macros y compara estructuras con memcmp y truquillos similares como se vanagloria el autor? Si la eficiencia no es determinante yo prefiero mil veces un if (cartaA == cartaB) a un if (memcmp(cartaA, cartaB, sizeof(carta)) == 0).

Comentarios:

if (memcmp(cartaA, cartaB, sizeof(carta)) == 0)

Solo funcionaría si cartaA y cartaB son strings estáticos (por el sizeof)).

Mejor usar:
if (strcmp(cartaA, cartaB) == 0)

Por lo demás, que el artículo sea de IBM le quita mucha objetividad.

Si eso fuera tan cierto, todo estaría desarrollado con Java: 3D Studio MAX, Photoshop, Opera, Firefox, ... Incluso Windows y Linux!
Lo del strcmp en teoría es para estructuras contiguas de memoria, no sólo cadenas. Por supuesto que no funciona siempre, pero esa es la idea que saqué del artículo: que el optimiza para que funcione... Y así lo hace menos mantenible, pero él no se da cuenta.

Con respecto a lo del 3D Studio MAX, Photoshop, etc., aparte de que hay otras razones además del rendimiento por las que Java no sirve para algunas cosas, también hay programas que están hechos en lo que están hechos porque Java no es tan viejo.
Hace tiempo fui a comprar un coche con un amigo, cuando el vendedor nos describía las características de un modelo (Fiat 1 creo recordar) hacía gran hincapié en la gran cantidad de espacio del maletero medida en metros cúbicos. Lo que no decía es que es espacio no estaba distribuido uniformemente en altura, anchura y largo, sino que era muy estrecho y muy alto, por lo que era muy poco aprovechable. Mi amigo le dijo algo al vendedor que aún recuerdo: sobre el espacio del maletero: “le voy a decir que todo el mundo sabe lo que es un maletero espacioso y este no lo es”. La cara del vendedor fue un verdadero poema porque sabía que mi amigo tenía razón.

Pues yo creo que con Java pasa lo mismo, todo el mundo sabe lo que es rápido y lo que es lento, y Java es más lento que C, punto. A partir de ahí se pueden hacer mil discusiones, que si para aplicaciones con interfaz gráfico eso no es tan importante, que si no se que implementación del algoritmo X se ejecuta más rápido sobre Java en no se que circunstancia, etc. Y sobre los trabajos científicos estoy convencido que hay gente que es capaz de justificar que la tierra es cuadrada con tal de publicar o con tal de hacer creer a otros la idea que le interesa que crean.
Buenísima historia, ruf: muy difícil de rebatir :-)

Sobre la ciencia, yo intento ver las cosas un poco más positivamente, pero doctores tiene la Iglesia... ;-)
Efectivamente strcmp vale para cualquier bloque contiguo de memoria, siempre y cuando no contenga NULL dentro, pues en ese caso, la comparación acabaría en ese punto
Es que la idea del código original era usar memcpy y no strcmp, pensando que CartaA y CartaB son estructuras de memoria.
En el comentario anterior quería decir «memcmp» y no «memcpy».
Es un error comparar el número de instrucciones de malloc/new de C/C++ y new de Java, ya que ese número no depende del lenguaje, si no de su implementación. De hecho, se puede usar un mismo algoritmo de alojamiento en el heap tanto para C/C++ como para Java. Por otro lado, el número de instrucciones no es una medida de la eficiencia en tiempo, pues puede haber bucles, y de hecho buscar un bloque libre de cierto tamaño en el heap puede incluir bucles.
yo estoy totalmente de acuerdo en que Java es mucho mas lento que C, lo que pasa es que actualmente debido a la velocidad de procesamiento de la CPU que hemos alcanzado, pues la diferencia ha disminuido.

Tambien creo que es un error decir que un algoritmo es mas eficiente que otro por el hecho de que uno tenga mas instrucciones que el otro. lo importante es el tiempo que dure cada algoritmo en obtener su resultado por ejemplo:
en C++
int a;
cin >> a;
cout << "El Valor de A es: " << a<< endl;

en java

for (long i=1;i<65535;i++)
System.out.println(i);

bueno me imagino que ya saben que el codigo en java a pesar que tenga 2 lineas va a ser mas lento. entonces no podemos medir la eficiencia de un algoritmo por el numero de lineas que posea
Publicar un comentario

This page is powered by Blogger. Isn't yours?

Blogroll
Enlaces
Archivos

Licencia Creative Commons
Este trabajo tiene licencia Creative Commons License.