Почему время выполнения приведенных ниже фрагментов кода сильно отличается? - PullRequest
4 голосов
/ 18 марта 2020

Рассмотрим приведенные ниже фрагменты кода и время, необходимое для их выполнения -

 public static void main(String[] args) {
    Long startTime = System.currentTimeMillis();
    long sum = 0L;
    for(int i = 0; i< Integer.MAX_VALUE; i++){
        sum+=i;
    }
    Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
    System.out.println("Time Difference : " + timeDiff + "secs");
}

Вывод -

Разница во времени: 0 сек

public static void main(String[] args) {
    Long startTime = System.currentTimeMillis();
    Long sum = 0L;
    for(int i = 0; i< Integer.MAX_VALUE; i++){
        sum+=i;
    }
    Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
    System.out.println("Time Difference : " + timeDiff + "secs");
}

Выход -

Разница во времени: 8 сек

public static void main(String[] args) {
    Long startTime = System.currentTimeMillis();
    Long sum = 0L;
    for(Long i = 0L; i< Integer.MAX_VALUE; i++){
        sum+=i;
    }
    Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
    System.out.println("Time Difference : " + timeDiff + "secs");
}

Выход -

Разница во времени: 16 сек

Насколько я понимаю, это происходит из-за каждого создания объекта Long Object каждый раз, я не уверен, как именно это происходит. Попытка просмотра байт-кода не сильно помогла. Помогите мне понять, как именно все происходит внутри?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 18 марта 2020

Операторы "++" и "+ =" определены только для примитивов.

Следовательно, когда вы применяете их к Long, распаковка должна произойти до того, как оператор будет оценен, а затем для сохранения результата должен иметь место бокс.

Бокс, вероятно, стоит больше, чем распаковка, поскольку для распаковки требуется только вызов метода, а для бокса - создание экземпляра объекта.

Каждый бокс включает создание Long экземпляра. Ваш l oop имеет Integer.MAX_VALUE итераций, поэтому второй l oop создает более 2 миллиардов Long объектов (по одному на каждую sum+=i операцию), в то время как третий l oop создает более 4 миллиардов Long объектов (один для каждой операции i++ и один для каждой операции sum+=i). Эти объекты необходимо создать, а затем собрать мусор. Это стоит времени.

2 голосов
/ 18 марта 2020

Возможные причины:
- Слишком много созданий объектов, ведущих к G C активности время от времени.
- Слишком много упаковок и распаковок Обертки для примитива и наоборот.

...