Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
¿Vas a probar gcj?

Sí, libre mola más   25 votes - 28 %
Según te portes   12 votes - 13 %
No, uso Sun-VM   8 votes - 9 %
No, uso IBM-VM   0 votes - 0 %
No, uso blackdown   2 votes - 2 %
No uso Java   17 votes - 19 %
No me gusta Java   17 votes - 19 %
Sólo uso Rubia-VM   6 votes - 6 %
 
87 Total Votes
Ver: Modo: Orden:
Compilando código Java | 15 comentarios (15 temáticos, editoriales, 0 ocultos)
Resultados más completos (5.00 / 1) (#1)
por man ls a las Tue May 11th, 2004 at 01:37:02 AM CET
(Información Usuario)

Para daros una visión más general del asunto, he hecho una comparativa un poco más a fondo entre la máquina virtual de Sun y el código compilado por gcj. Lo pongo en un comentario, para no distraer de la historia principal.

La primera comparativa es la "null": ejecuta los métodos de prueba pero sin nada dentro. Luego se sustrae a cada prueba el tiempo de esta primera. Todos los tiempos en segundos. Se miden siempre 1000000000 (10^9) iteraciones, excepto en append string donde sólo se realizan 200000 (2*10^5) (porque iba lentísimo en ambos).

El código de Sun se ejecuta así:
$ java -classpath "bin" Benchmarker
y el de gcj:
$ gcj -O5 --main=Benchmarker src/*.java -o benchmark
$ benchmark
results for null benchmark
java        gcj
0.812       1.527

results for add int benchmark
java        gcj
2.66        0.082

results for add float benchmark
java        gcj
3.703       0.981

results for add double benchmark
java        gcj
2.649       0.985

results for method call benchmark
java        gcj
2.818       0.081

results for create object benchmark
java        gcj
3.081       10.02

results for append string benchmark, 1/5000
java        gcj
4.003       9.583


Mi impresión general es que gcj se porta de maravilla con las operaciones aritméticas y las llamadas a métodos. Sin embargo, la creación de objetos -- y, sobre todo, la recolección automática -- le cuesta más. En general, es bastante impresionante, considerando los años y el esfuerzo que ha dedicado Sun a optimizar tanto el intérprete como el compilador HotSpot.

Máquina de prueba: PIV a 2.4 GHz, 512 MB de RAM, Mandrake 9.2, disco duro a manta. JDK 1.4.2 (HotSpot), gcj 3.3.2. Suministro el código de prueba a cambio de un foskito.



Preguntador-P-Pregunta (none / 0) (#10)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Wed May 12th, 2004 at 09:05:47 AM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

Sin embargo, la creación de objetos -- y, sobre todo, la recolección automática -- le cuesta más.
Hmmmm, por curiosidad, ¿has forzado la recolección de basura en las pruebas?

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson
[ Padre ]


No, no he llamado al recolector (none / 0) (#11)
por man ls a las Wed May 12th, 2004 at 01:29:03 PM CET
(Información Usuario)

Te refieres a la llamada System.gc(), ¿no? Lo malo es que sólo es un hint a la máquina virtual: puede pasar de ti, o puede darle por recoger objetos. No sé cómo se portará en el gcj.

También he visto una opción curiosa: usar el famoso recolector de Boehm, que ya me he encontrado mencionado en varios sitios. Debe ser la caña, y tiene que ser interesante compararlo con el que viene por defecto. Me lo apunto: forzar la recolección, y probar con el nuevo recolector de Boehm.

[ Padre ]


Sí, System.gc() (none / 0) (#14)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Fri May 14th, 2004 at 09:51:53 AM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

Ségun el libro de Bruce Eckel(*):
Si se invoca a System.gc() se finalizan todos los objetos. Esto no era necesario en el caso de las implementaciones previas de del JDK, aunque la documentación decía otra cosa.
(*) Lo he sacado de la edición en castellano (Piensa en Java), que corresponde con la 2ª edición en inglés. En ella se refiere principalmente a JDK 1.2 y 1.3.

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson
[ Padre ]


Ya lo he probado (none / 0) (#15)
por man ls a las Sat May 15th, 2004 at 05:48:45 PM CET
(Información Usuario)

Y no hay diferencia apreciable, entre crear n objetos y crear n objetos + llamar al recolector.

Tampoco hay diferencia apreciable usando el recolector de Boehm:
gcj [...] -fuse-boehm-gc
Vamos, que el tiempo de recolección no afecta mucho.

[ Padre ]


 
Pueeeeesss.... (4.00 / 1) (#2)
por thuban a las Tue May 11th, 2004 at 09:47:26 AM CET
(Información Usuario)

¿No es un poco decepcionante? Si, esta bien que haya un compilador y un interprete libre, pero ¿creeis que alguien va a usar una maquina virtual que es 35 veces mas lenta que la maquina de Sun? Recordemos que los de Sun son los que inventaron el lenguaje, los que dictan el estandar... En fin. La apuesta segura. Y ademas, es gratis (no se de nadie que haya tenido que pagar por el) tambien.

Puede hacerse que vaya mas deprisa, pero para eso hay que compilarlo (y perder la portabilidad).

A mi se me ocurren tres escenarios en los que se usa java:

* aplicaciones que se escriben una vez con la idea de que se ejecuten en cualquier sitio.

* servidores de JSPs, EJBs y cosas de esas.

* cualquier cosa que se escribe en Java por la sencilla razon de que es lo que sabe el que lo programa.

En el tercer caso no hay mucho que discutir. Se usa Java porque no hay mas remedio. Punto.

En el primero, la ventaja principal es que es portable el binario. Por ejemplo, JEdit es un editor que nos viene muy bien a los que tenemos Linux y Windows en la misma maquina (o en otra que usamos a menudo, como la del trabajo) porque usamos la misma aplicacion en cualquier sitio.

Si se usa gij la aplicacion sera ¡35 veces mas lenta! (o mas, o menos, pero mas lenta). Si se compila para que sea casi ¡el triple! de rapida, se pierde la portabilidad, a parte de que podrian dejar de funcionar cosas como carga dinamica de clases (hablo por hablar, que no lo he probado).

Se pierde la ventaja de usar Java para estas aplicaciones.

En el caso de los servidores empresariales, esos que sirven JSPs, EJBs y similares, no estoy seguro de que funcionen sobre gij, y si lo hacen, como el propio servidor hace compilacion dinamica, pooles de objetos, creacion dinamica y mas cosas de esas que estan tan cerca del lenguaje, es mas que probable que no funcionen bien.

Si se usa el interprete ira muuuucho mas lento, que es algo que en la web no se puede permitir.

Resumiendo: ¿Quien va a preferir el gij al java de Sun?

A mi se me ocurre que en proyectos libres donde se tenga acceso a las fuentes (hay muchas aplicaciones Java por ahi que no tienen accesibles las fuentes) donde no haya que compartir las clases entre varios sistemas operativos tiene mucho sentido hacer el ejecutable nativo (¿cuanto tardara la Gentoo en tener esto?), pero en el caso general, no.





Depende de las ganas que le pongas (none / 0) (#6)
por man ls a las Tue May 11th, 2004 at 09:25:44 PM CET
(Información Usuario)

Hace un par de años, un tipo contaba en la lista de Tomcat que lo había portado a C. Sí, C puro. También hay una versión de Axis en C++. Está claro que se puede programar lo que sea, pero se hace o no según el interés que se tenga.

Además, también puede haber otras ventajas, como el consumo de memoria. Es posible que, en tu hardware, el uso de Java sea prohibitivo; pero que una vez compilado sea más que aceptable.

No sé leer muy bien la salida de top, pero he hecho unas pruebecillas con mi librería de xml. Parseo un fichero más o menos grande, y luego la dejo esperando. El resultado es como sigue:
        VIRT   RES   SHR
java    205m   11m   39m
gcj    24400   11m   10m
Parece que consume muchísima menos memoria -- aunque la residente sea la misma. La verdad, no sé muy bien qué significa esto.

Personalmente, creo que gcj es una opción interesante a considerar.

[ Padre ]


significado (none / 0) (#13)
por musg0 a las Thu May 13th, 2004 at 03:33:32 PM CET
(Información Usuario) http://helvete.escomposlinux.org

Si no me equivoco RES es la memoria que está chupando la aplicación por sí misma, mientras que SHR es la que chupa de librerías compartidas que pueden ser usadas por más aplicaciones.

Que gcj tenga menos shared puede significar que como sólo soporta Java 1.1 las librerías dinámicas que usa tienen menos código.

[ Padre ]


 
Otras opciones (none / 0) (#3)
por ch3m4 a las Tue May 11th, 2004 at 10:39:00 AM CET
(Información Usuario) http://zaralinux.org

Si se habla de alternativas a la máquina virtual java, vale la pena incluir también el mono y el portablenet (dotGNU). Microsoft ofrece compiladores y "traductores" para pasar código java al entorno .Net , pero en el lado libre existe un proyecto para compilar java a CIL (http://jilc.sourceforge.net/)

En otro orden de cosas, pensaba que el JBoss no tenía la certificación J2EE. Sun ofrece becas para que proyectos de software libre obtengan la certificación, y a JBoss no le han ofrecido estas becas por ser un proyecto perteneciente a una empresa. El único proyecto libre que conozco que ha conseguido una certificación J2EE con estas becas era JOnAS del ObjectWeb.



Pues se ve que sí (none / 0) (#4)
por man ls a las Tue May 11th, 2004 at 11:34:05 AM CET
(Información Usuario)

Como cuentan en esta nota de prensa (lo siento, tienen la mala costumbre de ponerlas como pdf), no sólo están certificándose para J2EE 1.4, sino que además van a participar en el grupo experto que define la especificación de EJBs. Se ve que, tras años de llorar para obtener la certificación gratis, los de JBoss se han rascado el bolsillo para pagar la tarifa completa.

[ Padre ]


 
¿-O5? (none / 0) (#5)
por coder a las Tue May 11th, 2004 at 08:46:24 PM CET
(Información Usuario) http://fluzo.org/

Creo que esa opción no hace más que -O3. Que yo sepa GCC no optimiza más allá de -O3 (y haciendo demasiado "inlining", lo cual no es bueno). Todo lo que pongas a partir de -O4 (incluido) no tiene efecto sobre -O3. ¿O ha cambiado la cosa? ¿GCC 3.4?
atrapado por tu moda


Sigue igual (none / 0) (#7)
por ridiculum a las Wed May 12th, 2004 at 12:44:43 AM CET
(Información Usuario)

Segun la documentacion del gcc 3.3.3 y de gcc 3.4, la cosa sigue igual. Me suena vagamente, que en algun lugar de los fuentes del gcc se hace algo como :

if (flag_optimice > 3)
  flag_optimice = 3;
(evidentemente, no es exactamente asi, pero la idea se entenderá)

[ Padre ]


Sí, es así (4.00 / 1) (#12)
por jorginius ("jorginius" en Google Mail) a las Wed May 12th, 2004 at 05:34:07 PM CET
(Información Usuario) http://www.rodriguezmoreno.com

O casi, en realidad es un "if(optimize>=3)", aunque luego no hay un "if(optimize>=4)".

Por si alguien quiere echarle un ojo, aquí está la referencia cvsweb de opt.c de GCC.

Sobre lo que comenta coder de que con "-O3", gcc hace "demasiado inlining" sólo decir que es que con "-O2" el compilador no hace a ninguna función inline (ni muchas ni pocas :-)), a menos que la hayas marcado explícitamente con la extensión de GNU o de C99 (o la de C++, claro), y sin flag de optimización ("-O0") ni eso.

De hecho, esa es una de las razones por las que el kernel se compila con "-O2", evitar los inline para facilitar la depuración y los volcados de los errores.

Por otra parte, el "limite de complejidad" de lo que el compilador hará o no hará inline por su cuenta y riesgo cuando usemos "-O3", es configurable desde la línea de órdenes.

[ Padre ]


 
Se nota que soy un novato (none / 0) (#8)
por man ls a las Wed May 12th, 2004 at 12:53:50 AM CET
(Información Usuario)

Mi idea era optimizar el código al máximo, y no sabía cuál era el tope. Gracias, ya lo sé para la próxima.

[ Padre ]


En realidad lo has hecho bien (none / 0) (#9)
por jcantero (jcantero@agujero-negro.escomposlinux.org) a las Wed May 12th, 2004 at 08:48:08 AM CET
(Información Usuario) http://www.escomposlinux.org/jcantero/

Como podrás observar en muchos makefiles genéricos, se compila con optimizaciones al máximo (-O6) y luego es el compilador el que hace "el descuento". ;-)

Claro, eso en programas en los que sepamos que la optimización no afecta su funcionamiento.

--
"Papá, ¡Internet es más que una red pornográfica global!" -- Lisa Simpson
[ Padre ]


 
Compilando código Java | 15 comentarios (15 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:
Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda