Skocz do zawartości

[Java] "Porównanie" kolekcji na tablicach z kolekcjami linkowanymi


Toster

Polecane posty

Hejka,

Ostatnio robiłem sobie mały research w javie odnośnie podstawowych struktur danych i mam 2 wykresiki które może kogoś zainteresują. Porównywałem zużycie pamięci w przypadku kolekcji bazujących na zarządzanych tablicach i kolejkach. Poniżej można sobie zerknąć na wyniki, interesujące są te dwa niższe wykresy (z czterech) mowią one o wielkości zużywanej pamięci w danej chwili. Program tworzył 3M Integerów i dodawał je do kolekcji po czym kasował, co 10k elementów przy kasowaniu był wołany GC aby przeczyścić trochę widok i tak mamy na wykresie 1:

Niebieskie to LinkedList zielone to ArrayList. Ciekawa jest końcówka wykresu dla ArrayListy, dociekliwych odsyłam do źródeł dostępnych w JDK.

 

na wykresie 2 analogicznie:

Niebieskie to LinkedHashMap zielone to HashMap.

 

Teraz ciekawostka, ponieważ java operuje na pointerach do obiektów, w przypadku użycia LinkedList do przechowywania np samych Integerów jej rozmiar w pamięci jest momentami ~3x większy niż ArrayListy. Na tych wykresach tego nie widać gdyż wyszło to w innych pomiarach, tutaj przechowywałem dużo większe obiekty które ciut zaburzyły widok. Na koniec obrazki.

 

ArrayList vs LinkedArrayList

Listy.png

 

HashMap vs LinkedHashMap

Mapki.png

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Nie ogarniam javy bo nie mam z nią najmniejszej styczności. Ale w takim razie jak już zarzuciłeś takim tematem to musisz się wytłumaczyć :) NIe wiem czy dobrze rozumiem i czy dobrym tropem ale mówiąc, że ciekawa jest końcówka wykresu dla Arraylisty masz na myśli ten fragment gdzie krzywa zużycia pamięci nie "schodzi" do zera tylko zostaje na jakimś minimalnym poziomie?

 

 

Przez chwilę mnie to zaciekawiło ale chyba nie mam tyle czasu żeby poznawać jave od początku. Przejrzałem:

http://www.java2s.co...ayList.java.htm

i chwilę poświęciłem na przeczytanie czegoś tam o Garbage collector ale jakoś nigdzie nie znalazłem nakierowujących informacji.

 

Także czekam na jakieś naprowadzenie mnie na trop (chociaż java to nie mój kawałek chleba / chociaż zamierzam coś tam w końcu zacząć pisać na tego androida jak będzie chwila wolna)

 

Edit.: czy to coś jest związane z: "default capacity" czy też ogólnie z pojemnością ? czy bredze zupełnie?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Ogólnie odpowiedź na to pytanie nie ma nic wspólnego z javą, tylko ogólnie z kolekcjami. ArrayLista bazuje na zarządzanej wewnętrznie tablicy które może rosnąć w miarę potrzeb. Natomiast lista linkowana wewnętrznie składa się z wielu nodów które mają wskaźnik na kolejny (one way linked) albo na kolejny i poprzedni (double linked) + wskaźnik na dodany obiekt. Tak więc: Dodając element do ArrayListy wstawiamy po prostu pointer do tablicy, gdy brakuje nam tablicy to ją powiększamy. Po usuwaniu elementu z tablicy tablica nie jest resizowana automatycznie w dół, jej Capacity zostaje na stałym poziomie natomiast Size maleje. Ale, ponieważ capacity określające max. rozmiar tablicy się nie zmienia tak więc ArrayLista dopchana do iluś tam elementów, a później wyczyszczona do zera będzie zajmować więcej pamięci niż taka sama lista do której nigdy nic nie dodano.

Tak to z grubsza wygląda :)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...