Я запускаю этот код и получаю неожиданные результаты. Я ожидаю, что цикл, добавляющий примитивы, будет работать намного быстрее, но результаты не совпадают.
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)