Zählt count()
wirklich alle Elemente eines PHP-Arrays oder wird dieser Wert irgendwo zwischengespeichert und nur abgerufen?
Zählt count()
wirklich alle Elemente eines PHP-Arrays oder wird dieser Wert irgendwo zwischengespeichert und nur abgerufen?
Antworten:
Nun, wir können uns die Quelle ansehen:
/ext/standard/array.c
PHP_FUNCTION(count)
Aufrufe php_count_recursive()
, die wiederum ein zend_hash_num_elements()
nicht rekursives Array erfordern, das folgendermaßen implementiert wird:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Sie sehen also, es ist O(1)
für $mode = COUNT_NORMAL
.
IS_CONSISTENT(ht)
aber?
In PHP 5+ wird die Länge im Array gespeichert, sodass nicht jedes Mal gezählt wird.
BEARBEITEN: Diese Analyse könnte Sie auch interessieren: PHP Count Performance . Obwohl die Länge des Arrays vom Array beibehalten wird, scheint es immer noch schneller zu sein, daran festzuhalten, wenn Sie count()
mehrmals aufrufen .
PHP speichert die Größe eines Arrays intern, aber Sie führen immer noch einen Funktionsaufruf durch, wenn dieser langsamer ist als nicht. Daher möchten Sie das Ergebnis in einer Variablen speichern, wenn Sie es beispielsweise in einem verwenden Schleife:
Beispielsweise,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Außerdem können Sie nicht immer sicher sein, count
dass ein Array aufgerufen wird. Wenn es für ein Objekt aufgerufen wird, das Countable
beispielsweise implementiert wird , wird die count
Methode dieses Objekts aufgerufen.
the count method of that object will be called
, können Sie dies bitte ein wenig erklären
Countable
Schnittstelle implementiert , count($object)
ist das Aufrufen dasselbe wie das Aufrufen $object->count()
. Siehe zum Beispiel 3v4l.org/oYSSC .
you're still making a function call when which is slower than not making one
Diese Aussage kann falsch sein. Wenn Sie manuell durchlaufen, ist dies eine O(n)
Operation. Wenn Sie jedoch nur einen vorberechneten Wert abrufen möchten, lautet die Operation O(1)
.