Добавление чисел с использованием Java Long wrapper по сравнению с примитивными long

Я запускаю этот код и получаю неожиданные результаты. Я ожидаю, что цикл, добавляющий примитивы, будет работать намного быстрее, но результаты не совпадают.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        StringBuilder output = new StringBuilder();
        long start = System.currentTimeMillis();
        long limit = 1000000000; //10^9
        long value = 0;
        for(long i = 0; i < limit; ++i){}
        long i;
        output.append("Base time\n");
        output.append(System.currentTimeMillis() - start + "ms\n");
        start = System.currentTimeMillis();
        for(long j = 0; j < limit; ++j) {
            value = value + j;
        }
        output.append("Using longs\n");
        output.append(System.currentTimeMillis() - start + "ms\n");
        start = System.currentTimeMillis();
        value = 0;
        for(long k = 0; k < limit; ++k) {
            value = value + (new Long(k));
        }
        output.append("Using Longs\n");
        output.append(System.currentTimeMillis() - start + "ms\n");
        System.out.print(output);
    }
}

Вывод:

Базовое время 359 мс Использование лонгов 1842 мс Использование Лонгов 614 мс

Я пробовал запускать каждый отдельный тест в его собственной Java-программе, но результаты были одинаковыми. Что может быть причиной этого?

Небольшая деталь: запуск java 1.6

Редактировать: Я попросил двух других людей опробовать этот код, один из них получил точно такие же странные результаты, что и я. Другой получает результаты, которые действительно имеют смысл! Я попросил парня, который получил нормальные результаты, дать нам его двоичный файл класса. Мы запускаем его и ВСЕ ЕЩЕ получаем странные результаты. Проблема не во время компиляции (я думаю). Я запускаю 1.6.0_31, парень, который получает нормальные результаты, работает на 1.6.0_16, парень, который получает странные результаты, как и я, работает на 1.7.0_04.

Редактировать: получить те же результаты с помощью Thread.sleep(5000) в начале программы. Также получите те же результаты с циклом while вокруг всей программы (чтобы увидеть, будет ли время сходиться к нормальному времени после полного запуска java)

6
задан 27 May 2012 в 06:03
поделиться