Java efectivo: el mismo tiempo de invocación del método a pesar de crear múltiples instancias

Estoy estudiando Eficaz Java y en el Artículo 5 del Libro, Joshua Bloch habla sobre cómo evitar la creación de objetos innecesarios. Un ejemplo muestra los objetos de fecha mutables que nunca se modifican una vez que se han calculado sus valores.

Aquí la 'mala práctica':

public Person(Date birthDate) {
    this.birthDate = new Date(birthDate.getTime());
}

// DON'T DO THIS!
public boolean isBabyBoomer() {
    // Unnecessary allocation of expensive object
    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
    Date boomStart = gmtCal.getTime();
    gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
    Date boomEnd = gmtCal.getTime();
    return birthDate.compareTo(boomStart) >= 0
            && birthDate.compareTo(boomEnd) < 0;
}

El método isBabyBoomer crea innecesariamente un nuevo Calendario, Zona horaria y dos instancias de Fecha cada vez que se invoca, y eso claramente tiene sentido para mí.

Y aquí el código mejorado:

public Person(Date birthDate) {
    this.birthDate = new Date(birthDate.getTime());
}

/**
 * The starting and ending dates of the baby boom.
 */
private static final Date BOOM_START;
private static final Date BOOM_END;

static {
    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
    BOOM_START = gmtCal.getTime();
    gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
    BOOM_END = gmtCal.getTime();
}

public boolean isBabyBoomer() {
    return birthDate.compareTo(BOOM_START) >= 0
            && birthDate.compareTo(BOOM_END) < 0;
}

Las instancias de Calendario, Zona horaria y Fecha se crean solo una vez, cuando se inicializa. Bloch explica, que esto se traduce en ganancias significativas de rendimiento si el métodoisBabyBoomer()Se invoca con frecuencia.

En su máquina:
Mala versión: 32,000 ms para 10 millones de invocaciones.
Versión mejorada: 130ms para 10 millones de invocaciones.

Pero cuando ejecuto los ejemplos en mi sistema, el rendimiento es exactamente el mismo (14 ms). ¿Es esa una característica del compilador que las instancias solo se crean una vez?

Editar:
Aquí está mi punto de referencia:

    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(1960, Calendar.JANUARY, 1, 1, 1, 0);
    Person p = new Person(cal.getTime());
    long startTime = System.nanoTime();
    for (int i = 0; i < 10000000; i++) {
        p.isBabyBoomer();
    }
    long stopTime = System.nanoTime();
    long elapsedTime = stopTime - startTime;
    double mseconds = (double) elapsedTime / 1000000.0;
    System.out.println(mseconds);
}

Saludos, Markus

Respuestas a la pregunta(2)

Su respuesta a la pregunta