jdk - Java JRE vs GCJ
remove openjdk fedora 27 (6)
Tengo estos resultados de una prueba de velocidad que escribí en Java:
Java
real 0m20.626s
user 0m20.257s
sys 0m0.244s
GCJ
real 3m10.567s
user 3m5.168s
sys 0m0.676s
Entonces, ¿cuál es el propósito de GCJ entonces? Con estos resultados estoy seguro de que no voy a compilarlo con GCJ!
He probado esto en Linux, ¿son los resultados en Windows mejores que eso?
Este fue el código de la aplicación:
public static void main(String[] args) {
String str = "";
System.out.println("Start!!!");
for (long i = 0; i < 5000000L; i++) {
Math.sqrt((double) i);
Math.pow((double) i, 2.56);
long j = i * 745L;
String string = new String(String.valueOf(i));
string = string.concat(" kaka pipi"); // "Kaka pipi" is a kind of childly call in Dutch.
string = new String(string.toUpperCase());
if (i % 300 == 0) {
str = "";
} else {
str += Long.toHexString(i);
}
}
System.out.println("Stop!!!");
}
Compilé con GCJ así:
gcj -c -g -O Main.java
gcj --main=speedtest.Main -o Exec Main.o
Y corrió así:
time ./Exec // For GCJ
time java -jar SpeedTest.jar // For Java
"Entonces, ¿cuál es el propósito de GCJ entonces?"
Algunos han señalado que su "punto de referencia" no es justo. Sin embargo, incluso si lo fuera, todavía puedo ver un uso para GCJ. Supongamos que quieres escribir un kernel en Java. Con una JVM, tiene que portar la VM a un entorno independiente, y luego tendría que escribir el código de la palanca baja en C. Con un compilador AOT, puede solucionar este problema con algún código de pegamento y luego puede hacer la baja código de nivel en Java también. No es necesario portar el compilador en este caso.
Además, tenemos que separar la técnica de los puntos de referencia. Quizás la técnica AOT puede ser más poderosa que la técnica JIT siempre que invirtamos suficiente esfuerzo de desarrollo en ella.
¡Se ha topado con otro producto de "Software Freedom a cualquier costo!" línea de pensamiento. GCJ fue creado para permitir la compilación y ejecución de código Java sin depender de nada considerado como "no libre" por el proyecto GNU.
Si valora la libertad del software lo suficiente como para recibir un impacto de rendimiento 12x, entonces, ¡adelante!
El resto de nosotros con gusto utilizaremos la increíble JVM HotSpot de Sun (e, Oracle).
También: "Se ha combinado con GNU Classpath y es compatible con la mayoría de las bibliotecas 1.4 más unas 1.5 adiciones". Así que es un poco fuera de fecha también.
El compilador Java nativo de OpenJDK está, en sí mismo, escrito en Java; como consecuencia, necesita una versión anterior de Java que funcione para poder construir una nueva versión.
Si está comenzando desde cero en una plataforma para la cual no hay disponibles binarios JDK existentes (o si está trabajando dentro de ciertos proyectos de Software Libre cuyas cartas prohíben el uso de dependencias de compilación patentadas), entonces GCJ (o parte de su subyacente). Los componentes) pueden ser una solución potencial al problema de la gallina y el huevo de conseguir un Java de arranque, aunque algo ineficiente, para poder avanzar y construir el OpenJDK más deseable.
De hecho, cuando se anunció OpenJDK por primera vez, se dedicó un esfuerzo significativo (a través del proyecto IcedTea) a arreglar GCJ para llegar al punto en el que estaba a la altura de la tarea.
En x86 y AMD64, Hotspot solo usa SSE para punto flotante, pero veo que en x86 gcj no parece ser compatible con SSE y usa las instrucciones mucho más lentas 387:
gcj -O3 -mfpmath=sse --main=Bench Bench.java -o Bench
jc1: warning: SSE instruction set disabled, using 387 arithmetics
/tmp/ccRyR50H.i:1: warning: SSE instruction set disabled, using 387 arithmetics
Así que eso podría explicar la diferencia de velocidad.
Tenga en cuenta que cuando GCC usa SSE, supera ampliamente a Hotspot en punto flotante, ya que GCC genera instrucciones SIMD, mientras que Hotspot solo usa la aritmética SSE desempaquetada.
GCJ está obsoleto. Se inició hace mucho tiempo porque la gente quería una alternativa de código abierto al Sun JDK, y nunca fue particularmente buena. Ahora que Sun ha abierto su JDK, no hay absolutamente ninguna razón para usar GCJ (pero todavía se esconde en algunas distribuciones de Linux).
No es una comparación justa cuando haces la compilación AOT (Ahead-Of-Time) con poca optimización (-O). Pruebe al menos -O2.
Tampoco es tan simple como uno es más rápido que el otro en una sola prueba artificial. La compilación de AOT funciona mejor en algunos escenarios. Las JVM funcionan mejor en otros y también dependen en gran medida de la calidad de la JVM. En el mundo real, ecj es notablemente más rápido en la creación de OpenJDK cuando se compila AOT en lugar de cuando se ejecuta en la JVM. Para aplicaciones de larga ejecución, es probable que la JVM gane porque puede hacer uso de optimizaciones dinámicas que no son posibles antes de tiempo. ecj sufre porque durante el corto período de compilación, la JVM sigue interpretando el código. HotSpot compila y optimiza el código cuando determina que vale la pena (un "punto caliente").
Por cierto, es la FAQ que está desactualizada. GCJ soporta la mayoría de los 1.5, sin duda lo suficiente como para construir OpenJDK. Sin GCJ todavía ''al acecho en algunas distribuciones de Linux'', no sería posible construir OpenJDK en primer lugar.