Tablica vs SplFixedArray

Wiadomo jest, że natywna tablica w PHP jest tablicą asocjacyjną , dzięki czemu można używać jako kluczy zarówno liczb naturalnych jaki dowolnego ciągu znaków. Dodatkowo rozmiar tablicy jest dynamicznie zmieniany wraz ze zmianą ilości elementów w tablicy – daje nam to ogromne możliwości.

W tym artykule chciałbym jednak skoncentorwać się na tablicach indeksowanych. W ich przypadku nie musimy dbać o kolejność kluczy, jak to się ma w innyc języka.

$a = array();
$a[0] = 10;
$a[1] = 200;
$a[99] = 1;

Powyższy kod spowduje, iż zostanie utworzona tablica z trzema elementami, a wartości tej tablicy dla indeksów od 2 do 98 nie będą istniały. Takie podejście ma jedną podstawową zaletę nie musimy pamiętać o ciągłąsci indeksów w tablicy, ale musimy mieć także świadomość, że pytając się o dowolny element tablicy możemy dostać wartość NULL. 

Alternatywą do natywnej tablicy w PHP jest klasa SplFixedArray, która jest dostępna od PHP 5.3 jako jeden ze składników biblioteki SPL. Obiekt tej klasy staje się tablicą  o z góry określonej liczbie elementów, dzięki czemu skraca się czas podstawowych operacji na takich strukturach danych jak i zmniejsza ilość zużytej pamięci. Ważną informacją jest to, iż taka tablica jest tablicą indeksowaną.

$b = new SplFixedArray(100);
$b[0] = 10;
$b[1] = 200;
$b[99] = 1;

Tak utworzona tablica na starcie ma już zadeklarowanych 100 elementów o wartości NULL, w przeciwieństwie do tradycyjnej tablicy, gdzie deklaracja nie powoduje zaalokowania jakiejkolwiek ilości elementów. Próba dodania elementu spoza zakresu (ilości elementów), kończy się zwróceniem wyjątku RuntimeException z informacją Index invalid or out of range.

Obiecana szybkość i mniejsze zużycie pamięci pojawia się wraz z wzrastającą ilością elementów przechowywanych w tablicy. I tak dla przykładu czas i zużycie pamięci dla wygenerowania 20 tablic o róznej ilości elementów przedstawia się następująco:

ilość elementów: 1
spl: czas - 6.7472457885742E-6 pamięć - 907.6
tradycyjna tablica: czas - 3.7431716918945E-6 pamięć - 672
ilość elementów: 10
spl: czas - 7.4028968811035E-6 pamięć - 1688
tradycyjna tablica: czas - 6.4969062805176E-6 pamięć - 2536
ilość elementów: 100
spl: czas - 3.1745433807373E-5 pamięć - 9608
tradycyjna tablica: czas - 3.3700466156006E-5 pamięć - 21432.4
ilość elementów: 1000
spl: czas - 0.00027469396591187 pamięć - 88809.6
tradycyjna tablica: czas - 0.00032169818878174 pamięć - 208600
ilość elementów: 10000
spl: czas - 0.0030713558197021 pamięć - 880930.4
tradycyjna tablica: czas - 0.0046260476112366 pamięć - 2131684.4
ilość elementów: 100000
spl: czas - 0.03406800031662 pamięć - 8801188
tradycyjna tablica: czas - 0.054152691364288 pamięć - 21050751.6
ilość elementów: 1000000
spl: czas - 0.34679969549179 pamięć - 88003352.4
tradycyjna tablica: czas - 0.56010640859604 pamięć - 208405400.8

Jeśli chodzi o sam odczyt danych z obu tablic to jest on na tyle zbliżony, iż można powiedzieć że jest identyczny, natomiast nieco lepiej wypada losowe pobieranie elementu z obiektu SplFixedArray, przy pomocy funkcji array_rand.

Tak czy inaczej obydwa podejścia do tworzenia tablic mają swoje plusy i minusy, to który z nich wybierzemy, zależy od tego na jakiej ilości danych będziemy operowali i co chcemy osiągnąć.

Tablica vs SplFixedArray
Przewiń na górę