Jestem trochę zdezorientowany. W pierwszych iteracjach pętli wypełnienia widzę pewną regresję w czasie wypełniania, gdy używam initial capacity
dla ArrayList
vs bez użycia początkowej pojemności.Niektóre regresje podczas używania początkowej pojemności dla ArrayList w pierwszych iteracjach
Według zdrowego rozsądku i to pytanie: Why start an ArrayList with an initial capacity?
musi być całkowicie odwrotnie.
To nie jest dobrze napisany testów, i zastanawiam się: dlaczego na pierwszej iteracji to zawsze pochłania znacznie więcej czasu i procesora podczas korzystania z początkową zdolność do ArrayList
?
To jest test:
public class TestListGen {
public static final int TEST = 100_000_000;
public static void main(String[] args) {
test(false);
}
private static void test(boolean withInitCapacity) {
System.out.println("Init with capacity? " + withInitCapacity);
for (int i = 0; i < 5; i++)
av += fillAndTest(TEST, withInitCapacity ? new ArrayList<Integer>(TEST) : new ArrayList<Integer>());
System.out.println("Average: " + (av/5));
}
private static long fillAndTest(int capacity, List<Integer> list) {
long time1 = System.nanoTime();
for (int i = 0; i < capacity; i++) list.add(i);
long delta = System.nanoTime() - time1;
System.out.println(delta);
return delta;
}
}
wyjściowa: 1)
Init with capacity? false
17571882469
12179868327
18460127904
5894883202
13223941250
Average: 13466140630
2)
Init with capacity? true
37271627087
16341545990
19973801769
4888093008
2442179779
Average: 16183449526
Przetestowałem go na: JDK 1.7.0.40
, JDK 1.8.0.31
Co się stanie, jeśli testy wykonasz w odwrotnej kolejności (tzn. Najpierw z początkową wydajnością, a następnie bez)? –
GC losowo kopiąc w. Musisz uruchomić go dla więcej iteracji niż 5, aby mieć sensowną pomiaru .... – Zielu
Benchmarking kodu Java jest trudne. Proszę spojrzeć na http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – NPE