por
pobrecito hablador
el Miércoles, 14 Noviembre de 2007, 16:01h
(#981809)
Oigo últimamente muchos comentarios de gente diciendo que java no es tan lento, mostrando benchmarks [debian.org] en los que java suele ser el doble o el triple de lento que C, pero en los que sale que python, ruby y demás son como unas 20 veces más lentos.
Sin embargo, todos los programas java que conozco que pueden interesar a los usuarios de escritorio son más lentos que el caballo del malo. Como por ejemplo Azureus, o algún cliente de mensajería. Si tienes un pentium4 de hace unos cuantos años como el mio se arrastra. Sin embargo con más o menos la misma funcionalidad hechos en python y que si descontamos el tiempo de arranque, van cojonudamente.
Parece una contradicción comparado con los resultados de los benchmarks ¿A qué se debe ésto? ¿Están estos programas muy mal programados? ¿Las librerias gráficas de java son tan malas que cuando haces en programa de escritorio se arrastra pero en otros campos va rápido? ¿O es que las máquinas virtuales de java que tenemos instaladas el usuario medio son distintas a las que se usan para los benchmarks?
Exactamente ahí esta el problema de java en las librerías gráficas... el swing es lento con mala leche ya que la propia jvm la que pinta las ventanas, si ya se que existen interfaces (swt) para que las ventanas se pinten de forma nativa pero...
Sin embargo en python y demás las ventanas y todo el tema gráfico se ocupan librerías nativas de cada sistema y la sensación que da es mucho mas fluida..
por un lado, si, las librerias graficas de java dejan bastante que desear, tanto AWT como Swing, Azureus usa SWT que, en teoria, es nativo, asi que ese no es tu problema.
otro problema es que al ejecutar un programa java, gran parte de las bibliotecas de sistema y la maquina virtual se tienen que cargar en memoria, eso hace que el arranque sea algo lento, pero una vez en marcha, la cosa va como dicen los benchmarks
ahora bien, una cosa importante de java es configurar la maquina virtual, algo que muy pocas veces se hace (se hace poco en entornos profesionales, como para que lo haga la gente en casa)
aqui [sun.com] tienes una lista de las opciones posibles, pero, en general, lo unico que necesitaras tocar es:
-Xms
que indica el tamanio inicial de la pila, por defecto son 64MB (en otras palabras, no importa que tengas 2GB de ram libres, por defecto siempre cojera ese valor), y se supone que este tamanio va aumentando segun se va necesitando, en mi experiencia, ese crecimiento es bastante lento, asi que mejor si le defines algo mas grande desde el principio.
por ejemplo, en mi arranque de eclipse tengo puesto:
esto indica que use como minimo 128 MB de ram, como maximo 512 y que cree un espacio para la generacion permanente[1] de objetos entre 64MB y 128MB, pero en general esto ultimo no debe preocuparte (a menos que tengas muchas OutOfMemoryException:Perm), con esta configuracion a mi eclipse me va como un tiro, con 768MB de ram y un procesador mas bien malucho (pentium M a 1.66), incluso con todos los demas programas que tengo en marcha.
tambien se puede jugar mucho con el recolector de basura, tiene varias formas de trabajar, varios niveles de agresividad, etc, etc... pero vamos, para eso hay que saber bastante de como funciona internamente y yo no soy el mas indicado para explicarlo.
aqui [wilsonmar.com] tienes un link sobre como optimizar la maquina virtual.
otro consejo es que intentes tener la version de java lo mas actualizada posible, sobre todo en las versiones 1.5 y 1.6 le han dado bastante cania al rendimiento, y con un poco de suerte (bueno, con mucha suerte) la version 1.7 sera muy importante en este aspecto (digo lo de suerte porque se esta trabajando en reducir la jvm hasta un paquete basico de 2MB o menos y que el cliente se descargue de internet solo los paquetes que necesite, pero no se si les dara tiempo a meterlo en esta version)
por ultimo, en cuanto a lo que comentas de rendimiento, en los ultimos benchmarks que he visto java es similar en rendimiento a C, sobrepasandole en algunos casos (mas info [wikipedia.org])[2], desgraciadamente tanto las librerias graficas como el tiempo que tarda en cargar la jvm hace que a mucha gente le de la sensacion de que java es mucho mas lento.
[1] con "generacion" no me refiero al verbo "generar", el espacio de memoria de java esta definido en generaciones, espacio para objetos nuevos, para objetos viejos y permanentes
[2] la empresa donde trabajo desarrolla varios ESB [wikipedia.org], el producto principal era, hasta hace poco, un motor hecho en C++ sobre el que se podian poner servicios en C++ o en java, la nueva version se va a deshacer del nucleo de C++ para tenerlo hecho entero en java, la principal razon de esto es porque los propios benchmarks internos demuestran que se gana en rendimiento y de hecho se esta recomendando, para servicios que necesiten mucho rendimiento, que se use otro producto de la empresa (que es SL y gratuito) hecho integramente en java.
--
Dale fuego a un hombre y estara caliente un dia, prendele fuego y estara caliente el resto de su vida.
Vale, ¿pero donde está el plugin de java para linux de 64 bits?.
Llevamos los usuarios pidiéndolo 2 años y nada.
En Sun hay una página con miles de firmas y peticiones y ni puto caso.
¿cual será la razón?.
Sobre Java lento en programas de escritorio
(Puntos:2, Interesante)Sin embargo, todos los programas java que conozco que pueden interesar a los usuarios de escritorio son más lentos que el caballo del malo. Como por ejemplo Azureus, o algún cliente de mensajería. Si tienes un pentium4 de hace unos cuantos años como el mio se arrastra. Sin embargo con más o menos la misma funcionalidad hechos en python y que si descontamos el tiempo de arranque, van cojonudamente.
Parece una contradicción comparado con los resultados de los benchmarks ¿A qué se debe ésto? ¿Están estos programas muy mal programados? ¿Las librerias gráficas de java son tan malas que cuando haces en programa de escritorio se arrastra pero en otros campos va rápido? ¿O es que las máquinas virtuales de java que tenemos instaladas el usuario medio son distintas a las que se usan para los benchmarks?
Re:Sobre Java lento en programas de escritorio
(Puntos:4, Informativo)Sin embargo en python y demás las ventanas y todo el tema gráfico se ocupan librerías nativas de cada sistema y la sensación que da es mucho mas fluida..
Re:Sobre Java lento en programas de escritorio
(Puntos:5, Informativo)( http://barrapunto.com/ | Última bitácora: Lunes, 24 Febrero de 2014, 10:03h )
por un lado, si, las librerias graficas de java dejan bastante que desear, tanto AWT como Swing, Azureus usa SWT que, en teoria, es nativo, asi que ese no es tu problema.
otro problema es que al ejecutar un programa java, gran parte de las bibliotecas de sistema y la maquina virtual se tienen que cargar en memoria, eso hace que el arranque sea algo lento, pero una vez en marcha, la cosa va como dicen los benchmarks
ahora bien, una cosa importante de java es configurar la maquina virtual, algo que muy pocas veces se hace (se hace poco en entornos profesionales, como para que lo haga la gente en casa)
aqui [sun.com] tienes una lista de las opciones posibles, pero, en general, lo unico que necesitaras tocar es:
-Xms
que indica el tamanio inicial de la pila, por defecto son 64MB (en otras palabras, no importa que tengas 2GB de ram libres, por defecto siempre cojera ese valor), y se supone que este tamanio va aumentando segun se va necesitando, en mi experiencia, ese crecimiento es bastante lento, asi que mejor si le defines algo mas grande desde el principio.
por ejemplo, en mi arranque de eclipse tengo puesto:
-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
esto indica que use como minimo 128 MB de ram, como maximo 512 y que cree un espacio para la generacion permanente[1] de objetos entre 64MB y 128MB, pero en general esto ultimo no debe preocuparte (a menos que tengas muchas OutOfMemoryException:Perm), con esta configuracion a mi eclipse me va como un tiro, con 768MB de ram y un procesador mas bien malucho (pentium M a 1.66), incluso con todos los demas programas que tengo en marcha.
tambien se puede jugar mucho con el recolector de basura, tiene varias formas de trabajar, varios niveles de agresividad, etc, etc... pero vamos, para eso hay que saber bastante de como funciona internamente y yo no soy el mas indicado para explicarlo.
aqui [wilsonmar.com] tienes un link sobre como optimizar la maquina virtual.
otro consejo es que intentes tener la version de java lo mas actualizada posible, sobre todo en las versiones 1.5 y 1.6 le han dado bastante cania al rendimiento, y con un poco de suerte (bueno, con mucha suerte) la version 1.7 sera muy importante en este aspecto (digo lo de suerte porque se esta trabajando en reducir la jvm hasta un paquete basico de 2MB o menos y que el cliente se descargue de internet solo los paquetes que necesite, pero no se si les dara tiempo a meterlo en esta version)
por ultimo, en cuanto a lo que comentas de rendimiento, en los ultimos benchmarks que he visto java es similar en rendimiento a C, sobrepasandole en algunos casos (mas info [wikipedia.org])[2], desgraciadamente tanto las librerias graficas como el tiempo que tarda en cargar la jvm hace que a mucha gente le de la sensacion de que java es mucho mas lento.
[1] con "generacion" no me refiero al verbo "generar", el espacio de memoria de java esta definido en generaciones, espacio para objetos nuevos, para objetos viejos y permanentes
[2] la empresa donde trabajo desarrolla varios ESB [wikipedia.org], el producto principal era, hasta hace poco, un motor hecho en C++ sobre el que se podian poner servicios en C++ o en java, la nueva version se va a deshacer del nucleo de C++ para tenerlo hecho entero en java, la principal razon de esto es porque los propios benchmarks internos demuestran que se gana en rendimiento y de hecho se esta recomendando, para servicios que necesiten mucho rendimiento, que se use otro producto de la empresa (que es SL y gratuito) hecho integramente en java.
Dale fuego a un hombre y estara caliente un dia, prendele fuego y estara caliente el resto de su vida.
¿Y el plugin de 64bits?
(Puntos:2)Re:Distribuciones
(Puntos:2, Inspirado)( http://www.picandocodigo.net/ )
RTFM... Mi blog [barrapunto.com]
Re:Distribuciones
(Puntos:2)Avengers Assemble!!
Re:Ya esta a la altura de .NET?
(Puntos:1)( http://gabriel.freeunix.net/ )
protected static volatile transient boolean coolean = true;
Re:Ya esta a la altura de .NET?
(Puntos:2)( http://barrapunto.com/ )
A la altura del mono? Muy por encima.
En mi opinión, es así.