Java performance

August 05, 2017 java performance

Escribo esto por la sorpresa que me dió el siguiente descubrimiento.

Estaba leyendo algunas notas sobre performance en Java y como el autoboxing lo afectaba. En particular se plantea el siguiente ejemplo:

    public static void main(String[] args){
        long start = System.currentTimeMillis();
        long sum = 0L;
        for (long i = 0; i <= Integer.MAX_VALUE; i++) {
            sum += i;
        }
        System.out.println(sum + " took " + (System.currentTimeMillis()-start) + "ms");
    }

El programa tarda 1329ms. No me interesa ponerme en detalle con el modelo de cpu ya que lo importante son los tiempos relativos de procesamiento.

Si sum lo cambiamos de long a Long, el tiempo se dispara, pasando a demorar 11901ms (9 veces más).

Ahora ¿qué pasaría si i dentro del for estuviera declarado como de tipo int? ¿Afectaría mucho el tiempo por tener que operar un int contra un long? Este es el código modificado:

    public static void main(String[] args){
        long start = System.currentTimeMillis();
        long sum = 0L;
        for (long i = 0; i < Integer.MAX_VALUE; i++) {
            sum += i;
        }
        System.out.println(sum + " took " + (System.currentTimeMillis()-start) + "ms");
    }

Nota: se removió del for la comparación i <= Integer.MAX_VALUE reemplazándola por un menor estricto. Esto es porque cuando i es igual a MAX_VALUE, al sumarle uno se torna negativo, por lo que al consultar en la siguiente iteración si i (con valor negativo), es menor que MAX_VALUE, esto será cierto y estaríamos ante un loop infinito.

Esta última prueba no sumó demasiado tiempo, de hecho demostró ser un poco más rápida que la versión que suma longs con longs: 994ms. Y pasando sum de long a Long no hubo demasiado cambio 11537ms.

Conclusión:

Operar con valores primitivos es casi 10x más rápido (al menos para la suma), que operar con la clase correspondiente. Pueden hacer pruebas ustedes mismos y enviarme los comentarios o si creen que hay cosas para modificar sobre cómo fue hecha la prueba.


Profile picture

Written by Gastón Fournier Software Engineer at @getunleash working from Cunit, Tarragona, Spain, where I live with my wife and 2 dogs. Find me on Twitter Github LinkedIn