Autoboxing utiliza Integer.valueOf
, que guarda en caché internamente objetos enteros para enteros pequeños (por defecto -128 a 127, pero el valor máximo se puede configurar con la propiedad "java.lang.Integer.IntegerCache.high" - ver el código fuente de Integer.valueOf), por lo que es diferente de llamar directamente al new Integer
. Como Integer.valueOf
realiza una comprobación rápida de la magnitud del valor entero antes de llamar al new Integer
, es un poco más rápido llamar al new Integer
directamente (aunque usa más memoria si tiene muchos enteros pequeños). La asignación en Java es muy rápida, y el tiempo de GC es proporcional al número de objetos vivos de corta duración (es decir, no es proporcional a la cantidad de basura), por lo que el GC también es muy rápido.
Pero según la versión de JVM y qué optimizaciones están habilitadas, existe la optimización de reemplazo escalar, que puede producir una diferencia de rendimiento mucho mayor cuando se asignan objetos de corta vida (en su ejemplo no se puede optimizar, porque está almacenando los objetos en un mapa, pero en muchas otras situaciones es útil).
En versiones JVM recientes hay optimización scalar replacement (excepto en 1.6.0_18 donde el análisis de escape es temporarily disabled), lo que significa que las asignaciones de objetos efímeros pueden optimizarse. Cuando el reemplazo escalar en JVM era nuevo, alguien hizo a benchmark donde había un código similar al suyo. El resultado fue que el código que utilizaba primitivas era el más rápido, el código con llamadas explícitas new Integer()
era casi tan rápido como el que usaba primitivas, y el código que utilizaba el autoboxing era mucho más lento. Esto se debió a que el autoboxing usa Integer.valueOf
y al menos entonces la optimización de reemplazo escalar no tomó en consideración ese caso especial. No sé si la optimización se ha mejorado desde entonces.
Trate de envolver las dos partes y microbenchmark de nuevo. – BalusC
porque fuera de tu micro-benchmark ideado que es incorrecto, no importa ya que esto se optimizará pero eventualmente JIT en el mundo real. –