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.