Ich bin ein bisschen verwirrt. Bei den ersten Iterationen von Füllschleifen sehe ich eine gewisse Rückbildung der Füllzeit, wenn initial capacity
für ArrayList
vs verwendet wird, ohne die Anfangskapazität zu verwenden.Einige Regression bei der Verwendung der Anfangskapazität für ArrayList auf den ersten Iterationen
Nach dem gesunden Menschenverstand und diese Frage: Why start an ArrayList with an initial capacity?
muss es unbedingt umgekehrt sein.
Es ist Benchmark-Test nicht gut geschrieben, und ich frage mich: warum auf der ersten Iteration es immer viel mehr Zeit und CPU verbraucht, wenn für ArrayList
Anfangskapazität mit?
Dies ist der 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;
}
}
Ausgang: 1)
Init with capacity? false
17571882469
12179868327
18460127904
5894883202
13223941250
Average: 13466140630
2)
Init with capacity? true
37271627087
16341545990
19973801769
4888093008
2442179779
Average: 16183449526
ich es auf getestet haben: JDK 1.7.0.40
, JDK 1.8.0.31
Was passiert, wenn Sie die Tests in der umgekehrten Reihenfolge ausführen (dh zuerst mit der Anfangskapazität, dann ohne)? –
GC zufällige treten. Sie müssen es für mehr Iterationen als 5 ausführen, um vernünftige Messung zu haben .... – Zielu
Benchmarking Java-Code ist schwer. Bitte werfen Sie einen Blick auf http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – NPE