У меня есть две следующие программы:
long startTime = System.currentTimeMillis();
for (int i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
и
long startTime = System.currentTimeMillis();
for (long i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
Примечание: единственная разница - это тип переменной цикла (int
и long
).
Когда я запускаю это, первая программа последовательно печатает от 0 до 16 мсек, независимо от значения N
. Вторая занимает намного больше времени. Для N == Integer.MAX_VALUE
он работает на моей машине примерно за 1800 мсек. Время выполнения кажется более или менее линейным в N
.
Так почему же это?
Полагаю, JIT-компилятор оптимизирует цикл int
до смерти. И не зря, потому что, очевидно, это ничего не делает. Но почему это не так для цикла long
?
Коллега подумал, что мы можем измерить JIT-компилятор, выполняя свою работу в цикле long
, но, поскольку время выполнения кажется линейным в N
, это, вероятно, не так.
Я использую JDK 1.6.0 обновление 17:
C:\>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
Я работаю на Windows XP Professional x64 Edition, с пакетом обновления 2, с процессором Intel Core2 Quad с тактовой частотой 2,40 ГГц.
ОТКАЗ
Я знаю, что микробенчмарки бесполезны в производстве. Я также знаю, что System.currentTimeMillis()
не так точно, как предполагает его название. Это то, что я заметил, когда дурачился, и мне было просто любопытно, почему это происходит; больше ничего.