2013-02-01 4 views
5

DlaczegoDlaczego czas na tablicy initialize innym

 long t = System.currentTimeMillis(); 
     int size = 3333333; 
     int[][][] arr = new int[size][6][2]; 
//  int[][][] arr= new int[2][6][size]; 
     pr(System.currentTimeMillis() - t); 

drukuje 5000 ms ale

 long t = System.currentTimeMillis(); 
     int size = 3333333; 
//  int[][][] arr = new int[size][6][2]; 
     int[][][] arr= new int[2][6][size]; 
     pr(System.currentTimeMillis() - t); 

drukuje 44 ms

Drugie rozwiązanie 115 czas szybciej

+1

Jak uruchomić ten fragment kodu? czy mógłbyś opublikować całą metodę? Ile razy je uruchamiasz? Ile uruchomiłeś początkowych cykli? Benchmarking operacji Java nie jest rzeczą banalną ... – ppeterka

+1

Zobacz: http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java - The way are are wykonanie tego prawdopodobnie nie przyniesie znaczących rezultatów. –

Odpowiedz

6

To prostsze przetestować int[][]

int[][] arr = new int[size][2]; 

W tym przypadku musisz przydzielić size pamięci o rozmiarze 16 bajtów.

I w tym przypadku

int[][] arr = new int[2][size]; 

trzeba tylko przeznaczyć 2 kawałki wielkości pamięci * 8 bajtów.

A alokowanie to droga operacja.

+1

115 razy szybciej? Myślę, że jest to problem związany z inicjowaniem JVM i początkowym procesem optymalizacji ... – ppeterka

+0

Z optymalizacją lub bez niej w pierwszej próbce trzeba przechowywać wiele obiektów (tablica) i przydzielać je wszystkie w stercie, aw drugim przykładzie są tylko 2 obiekty – dilix

+1

Muszę to przyznać, masz rację. Stworzyłem mały, poprawny punkt odniesienia wokół niego, a wynik jest (mniej więcej) taki sam. Myślę, że nadszedł czas, abym przeprowadził badania wokół tego ... – ppeterka