El concepto de javac optimization

¿Cómo funciona el concepto de javac optimization? . Recordemos que javac es el compilador de Java y se encarga de compilar nuestro código “Java” en código para la maquina virtual.

JavacOptimizerSin

Javac Optimization

En principio solemos pensar que se trata de una transformación del código directa , sin embargo no es exactamente así ya que el compilador es capaz de analizar el código y realizar optimizaciones en él. Vamos a ver un ejemplo sencillo de que cosas hace el compilador para mejorar nuestro código. El siguiente bloque de código esta lleno de constantes.


package com.arquitecturajava;

public class MiClase {

public static final int asistentes=10;
public static final int gasto=5;
public static final int gastoTotal= asistentes*gasto;
public void imprimir () {

if (gastoTotal>=50) {
System.out.println("hemos gastado mas " +"de 50 euros");
}
}

}

 

El código compila correctamente y nos generará un fichero .class . Si revisamos el código nos podemos dar cuenta de que realmente hay mucho código sobrante que con un análisis sencillo se eliminaría. Es momento de usar un decompilador de Java y ver cual es contenido real de nuestro fichero compilado. En este caso he usado uno online JavaDecompiler  que nos muestra el código que realmente contiene nuestro fichero.


/*
* Decompiled with CFR 0_114.
*/
package com.arquitecturajava;

import java.io.PrintStream;

public class MiClase {
public static final int asistentes = 10;
public static final int gasto = 5;
public static final int gastoTotal = 50;

public void imprimir() {
System.out.println("hemos gastado mas de 50 euros");
}
}

El código para nuestra sorpresa será bastante diferente al que nosotros habíamos construido.

JavacOptimizer

Es aquí donde el compilador de Java realiza sus optimizaciones y es capaz de entender que el gasto total es un valor fijo y que el if sobraba porque siempre el número será mayor de 50.

Otros artículos relacionados:  Java StringBuilder , Java WorkFlows , Java Flyweight

It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

11 Responses to El concepto de javac optimization

  1. Jesús Perales 9 Junio, 2016 at 0:08 #

    Nunca imagine que el compilador de java hiciera cosas como esa xD

    • Cecilio Álvarez Caules 9 Junio, 2016 at 7:23 #

      En Java hay mil trucos 🙂

  2. Agustín Ventura 9 Junio, 2016 at 9:28 #

    Buenas Cecilio,

    Buen artículo explicando de forma muy concisa que el compilador no es un interprete, sino un compilador y por tanto tiene inteligencia. No sé por qué es algo bastante extendido el creer que el compilador simplemente traduce.
    Por otra parte estaría muy bien por seguir en este sentido que hablases un poco de JIT y optimizaciones “al vuelo” 🙂

    Un saludo y gracias!

    • Cecilio Álvarez Caules 9 Junio, 2016 at 9:44 #

      gracias por el aporte 🙂 , voy recogiendo ideas

  3. David 9 Junio, 2016 at 9:42 #

    Entonces, ¿crees que es mejor no complicarnos la vida y escribir más clarito el código? Yo ya llegue a esa conclusión con las operaciones ternarias que el javac optimization genera a partir de if sencillos y emborronan en muchos casos la lectura del código.

    • Cecilio Álvarez Caules 9 Junio, 2016 at 11:02 #

      Yo prefiero la claridad ante todo , salgo casos excepcionales

  4. Alejandro G. 9 Junio, 2016 at 14:33 #

    Muy buen artículo.

    Para tirar ideas, estaría bueno hablar un poco sobre errores frecuentes que los desarrolladores cometemos (algunos no los corrige javac), y cómo evitarlos. Ejemplo: retornar dentro de un bloque “catch” o “finally”

  5. anonymous 9 Junio, 2016 at 17:49 #

    Buenas Cecilio,

    Modifica el ejemplo porque esta equivocado, ese “if” es un Dead Code por lo que el compilador no lo transformara en el .class.

    La función imprimir quedará:

    public void imprimir() {}

    Saludos.

    • Cecilio Álvarez Caules 9 Junio, 2016 at 20:33 #

      muchas gracias , ya lo he corregido

  6. Dennis Huamán 9 Junio, 2016 at 18:06 #

    “el if sobraba porque siempre el número será mayor de 50”

    50 > 50?

    Acaso eso no retorna false, o me estoy perdiendo de algo que no veo.

    • Cecilio Álvarez Caules 9 Junio, 2016 at 20:33 #

      Gracias por el aporte tenía que ser >= 🙂

Deja un comentario