Я проводил некоторое тестирование производительности в отношении размещения объектов, когда наткнулся на странный результат. У меня есть следующий код Java:
public static long TestMethod(){
int len = 10000000;
Object[] obs = new Object[len];
long t = System.nanoTime();
for (int i = 0; i < len; i++) {
obs[i] = new Object();
}
return System.nanoTime() - t;
}
public static void main(String... args) throws InterruptedException {
for(int i = 0; i < 10; i++){
System.gc();
System.gc();//Wait for the gc to be finished
Thread.sleep(1000);
System.out.println(TestMethod());
}
}
Ожидание: первый вызов будет медленнее второго из-за запроса большего объема памяти от операционной системы и усовершенствований точки доступа. Но второй и третий будут почти одинаковыми.
Наблюдаемый результат:
11284734000
799837000
682304000
304736000
380770000
392786000
374279000
381611000
379174000
407256000
Все еще значительное ускорение между третьей и четвертой итерацией. Чем вызвано это ускорение? Как я могу быть уверен, что мои измерения точны при тестировании других функций, нужно ли вызывать функцию более четырех раз перед измерением?
-XX:+PrintCompilation -verbose:gc
VM поможет вам понять, что происходит. - person assylias   schedule 31.12.2012