2015-03-25 3 views
6

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

+0

Was passiert, wenn Sie die Tests in der umgekehrten Reihenfolge ausführen (dh zuerst mit der Anfangskapazität, dann ohne)? –

+4

GC zufällige treten. Sie müssen es für mehr Iterationen als 5 ausführen, um vernünftige Messung zu haben .... – Zielu

+6

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

Antwort

2

Es ist ein Java-Heap-Zuordnungsartefakt, das die Ergebnisse verursacht, die Sie nicht erwarten. Passen Sie die anfängliche Heapzuweisung an, und Sie erhalten konsistentere Ergebnisse, wenn Sie Heap-Zuweisungszeiten aus dem Mix entfernen. Außerdem müssen Sie sicherstellen, dass der Prozess, auf dem der Benchmark ausgeführt wird, nicht ausgetauscht wird. Auf meinem System habe ich einen OOM Fehler als TEST = 100_000_000 bekommen und musste ihn für meine Tests auf 10_000_000 reduzieren. Ich habe auch beide test(false) und test(true) nacheinander ausgeführt. Beachten Sie, dass die Zuweisung der Heap beim Start und das Hinzufügen von expliziten GC in den Ergebnissen die einzelnen Zeiten viel konsistenter machen. Das Hinzufügen eines Warmups wäre ebenfalls wichtig, um den Test konsistenter zu machen, aber ich habe mich nicht darum gekümmert.

Original-Test

Init with capacity? false 
1714537208 
1259523722 
1215986030 
1098740959 
1029914697 
Average: 1263740523 
Init with capacity? true 
343100302 
612709138 
355210333 
603609642 
348401796 
Average: 452606242 

-Test mit -Xms500m -Xmx500m

Init with capacity? false 
682827716 
738137558 
576581143 
662777089 
555706338 
Average: 643205968 
Init with capacity? true 
368245589 
312674836 
297705054 
392935762 
307209139 
Average: 335754076 

-Test mit -Xms500m -Xmx500m + System.gc() vor fillAndTest()

Init with capacity? false 
502767979 
435508363 
420956590 
487184801 
416041923 
Average: 452491931 
Init with capacity? true 
300744404 
298446734 
299080656 
300084036 
298473576 
Average: 299365881 
+0

Cool, Sie sind absolut richtig, danke – Andremoniy

+0

@Andremoniy Sure thing. Ist es nicht interessant, je mehr Schritte Sie unternehmen, um Heap Allokationen/GC aus dem Mix zu entfernen, je näher die Performance zwischen dem Konstruieren mit und ohne Initialkapazität ist? Es ist ein Beweis für die Magie, die Array-Kapazität dynamisch um 1,5 zu erhöhen. –

Verwandte Themen