Czy count()
naprawdę liczy wszystkie elementy tablicy PHP, czy też ta wartość jest gdzieś przechowywana w pamięci podręcznej i po prostu jest pobierana?
php
arrays
performance
Dexter
źródło
źródło
Odpowiedzi:
Cóż, możemy spojrzeć na źródło:
PHP_FUNCTION(count)
wywołaniaphp_count_recursive()
, które z kolei wywołujązend_hash_num_elements()
tablicę nierekurencyjną, która jest implementowana w ten sposób:Więc widzisz, to
O(1)
dla$mode = COUNT_NORMAL
.źródło
IS_CONSISTENT(ht)
?W PHP 5+ długość jest przechowywana w tablicy, więc zliczanie nie jest wykonywane za każdym razem.
EDYCJA: Ta analiza może być również interesująca: Wydajność liczenia PHP . Chociaż długość tablicy jest utrzymywana przez tablicę, nadal wydaje się, że szybsze jest jej zatrzymanie, jeśli zamierzasz wywoływać
count()
wiele razy.źródło
PHP przechowuje wewnętrznie rozmiar tablicy, ale nadal wywołujesz funkcję, która jest wolniejsza niż jej brak, więc będziesz chciał przechowywać wynik w zmiennej, jeśli robisz coś takiego jak użycie jej w pętla:
Na przykład,
Ponadto nie zawsze można mieć pewność,
count
że wywoływana jest tablica. Jeśli zostanie wywołana na obiekcie, który implementujeCountable
na przykład,count
zostanie wywołana metoda tego obiektu.źródło
the count method of that object will be called
, czy możesz to trochę wyjaśnićCountable
interfejs, wywołaniecount($object)
jest tym samym, co wywołanie$object->count()
. Zobacz na przykład 3v4l.org/oYSSC .you're still making a function call when which is slower than not making one
To stwierdzenie może być błędne. Jeśli wykonujesz ręczne przechodzenie, to jestO(n)
operacja. Ale jeśli chcesz tylko pobrać wstępnie obliczoną wartość, operacja jestO(1)
.