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?
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?
Odpowiedzi:
Cóż, możemy spojrzeć na źródło:
/ext/standard/array.c
PHP_FUNCTION(count)
wywołania php_count_recursive()
, które z kolei wywołują zend_hash_num_elements()
tablicę nierekurencyjną, która jest implementowana w ten sposób:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Więc widzisz, to O(1)
dla $mode = COUNT_NORMAL
.
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.
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,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Ponadto nie zawsze można mieć pewność, count
że wywoływana jest tablica. Jeśli zostanie wywołana na obiekcie, który implementuje Countable
na przykład, count
zostanie wywołana metoda tego obiektu.
the count method of that object will be called
, czy możesz to trochę wyjaśnić
Countable
interfejs, wywołanie count($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 jest O(n)
operacja. Ale jeśli chcesz tylko pobrać wstępnie obliczoną wartość, operacja jest O(1)
.