Краткий ответ: Чтобы избежать этой проблемы, поместите код, который вы тестируете, в отдельный метод . Разогрейте метод, вызвав его 11 000 раз, прежде чем начать. Эти 2 позволят JIT-компилятору поменять метод на скомпилированную версию. Запустите с -server, он просто лучше настроен. Используйте System.nanoTime () для измерения времени. С помощью следующего кода вы получите последовательные измерения.
public class AlphaTest
{
public static void processA(int[] arr)
{
for (int i = 0; i < arr.length; i++)
if (arr[i] > 0)
System.out.print("");
}
public static void processB(int[] arr)
{
for (int i = 0; i < arr.length; i++)
if (0 < arr[i])
System.out.print("");
}
public static void main(String[] args)
{
int[] smallArr = new int[10];
for (int i = 0; i < smallArr.length; i++)
{
smallArr[i] = 1;
}
//warmup
for (int i = 0; i < 11000; i++)
{
processA(smallArr);
processB(smallArr);
}
int[] arr = new int[100000000];
arr[99999999] = 1;
long t1, t2, t3;
for (int ndx = 0; ndx < 10; ndx++)
{
t1 = System.nanoTime();
processA(arr);
t2 = System.nanoTime();
processB(arr);
t3 = System.nanoTime();
System.out.println(((t2 - t1)/1000000L) + " " + ((t3 - t2)/1000000L));
}
}
}
Длинный ответ:
Это определенно проблема «микробенчмаркинга», как отметил Мэтт в комментариях. Пожалуйста, смотрите Azul Blog . Чтобы поддержать эту точку зрения, я получаю следующие результаты в зависимости от того, как я запускаю программу: as -client as -server и с отключенным JIT только 2 строки результатов на установку, остальные похожи.
java -client -Xms1024m -Xmx1024m Test
272 262
263 252
...
java -server -Xms1024m -Xmx1024m Test
513 173
483 201
...
java -client -Djava.compiler=NONE -Xms1024m -Xmx1024m AlphaTest
2062 1929
2042 2034
...
java -server -Djava.compiler=NONE -Xms1024m -Xmx1024m AlphaTest
1844 1864
1843 1931