Эффективная Java - одно и то же время вызова метода, несмотря на создание нескольких экземпляров

Изучая «Эффективную Java» и в пункте 5 книги, Джошуа Блох рассказывает об избежании создания ненужных объектов. Пример демонстрирует изменяемые объекты Date, которые никогда не изменяются после вычисления их значений.

Здесь 'плохая практика »:

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;
}

Метод isBabyBoomer без необходимости создает новый Calendar, TimeZone и два экземпляра Date каждый раз, когда он вызывается - и это, несомненно, имеет смысл для меня.

А вот улучшенный код:

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;
}

Экземпляры Calendar, TimeZone и Date создаются только один раз при инициализации. Блох объясняет, что это приводит к значительному увеличению производительности, если методisBabyBoomer()часто вызывается.

На его машине:

Плохая версия: 32 000 мс на 10 миллионов вызовов

Улучшенная версия: 130 мс для 10 миллионов вызовов

Но когда я запускаю примеры в моей Системе, производительность точно такая же (14 мс). Это функция компилятора, что экземпляры создаются только один раз?

Редактировать:

Вот мой тест:

    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);
}

Ура, Маркус

Ответы на вопрос(2)

Ваш ответ на вопрос