Fa count()
davvero contare gli tutti gli elementi di un array PHP, o è questo valore memorizzato nella cache da qualche parte e appena viene recuperata?
Fa count()
davvero contare gli tutti gli elementi di un array PHP, o è questo valore memorizzato nella cache da qualche parte e appena viene recuperata?
Risposte:
Bene, possiamo guardare la fonte:
/ext/standard/array.c
PHP_FUNCTION(count)
chiamate php_count_recursive()
, che a loro volta richiedono un zend_hash_num_elements()
array non ricorsivo, che viene implementato in questo modo:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Quindi puoi vedere, è O(1)
per $mode = COUNT_NORMAL
.
IS_CONSISTENT(ht)
fa?
In PHP 5+ la lunghezza è memorizzata nell'array, quindi il conteggio non viene eseguito ogni volta.
EDIT: Potresti anche trovare interessante questa analisi: PHP Count Performance . Sebbene la lunghezza dell'array sia mantenuta dall'array, sembra comunque che sia più veloce mantenerlo se hai intenzione di chiamare count()
molte volte.
PHP memorizza internamente la dimensione di un array, ma stai ancora effettuando una chiamata di funzione quando è più lento che non crearne una, quindi ti consigliamo di memorizzare il risultato in una variabile se stai facendo qualcosa come usarlo in un ciclo continuo:
Per esempio,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Inoltre, non puoi sempre essere sicuro che count
venga chiamato su un array. Se viene chiamato su un oggetto che implementa, Countable
ad esempio, count
verrà chiamato il metodo di quell'oggetto.
the count method of that object will be called
, puoi spiegare un po 'questo
Countable
interfaccia, chiamare count($object)
è la stessa cosa che chiamare $object->count()
. Vedi 3v4l.org/oYSSC per esempio.
you're still making a function call when which is slower than not making one
Questa affermazione può essere sbagliata. Se stai eseguendo l'attraversamento manuale, questa è O(n)
un'operazione. Ma se vuoi solo recuperare un valore pre calcolato, l'operazione è O(1)
.