Será que count()realmente contam os todos os elementos de uma matriz PHP, ou se este valor em cache em algum lugar e só fica recuperados?
Será que count()realmente contam os todos os elementos de uma matriz PHP, ou se este valor em cache em algum lugar e só fica recuperados?
Respostas:
Bem, podemos olhar a fonte:
/ext/standard/array.c
PHP_FUNCTION(count)chamadas php_count_recursive(), que por sua vez chamam zend_hash_num_elements()uma matriz não recursiva, que é implementada desta forma:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Então você pode ver, é O(1)para $mode = COUNT_NORMAL.
IS_CONSISTENT(ht)fazer?
No PHP 5+, o comprimento é armazenado no array para que a contagem não seja feita todas as vezes.
EDIT: Você também pode achar esta análise interessante: Desempenho de contagem de PHP . Embora o comprimento do array seja mantido pelo array, ainda parece que é mais rápido mantê-lo se você for chamar count()muitas vezes.
PHP armazena o tamanho de um array internamente, mas você ainda está fazendo uma chamada de função quando é mais lenta do que não fazer uma, então você vai querer armazenar o resultado em uma variável se estiver fazendo algo como usá-lo em um ciclo:
Por exemplo,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Além disso, você nem sempre pode ter certeza de que countestá sendo chamado em um array. Se for chamado em um objeto que o implementa, Countablepor exemplo, o countmétodo desse objeto será chamado.
the count method of that object will be called, você pode explicar isso um pouco
Countableinterface, então chamar count($object)é a mesma coisa que chamar $object->count(). Consulte 3v4l.org/oYSSC por exemplo.
you're still making a function call when which is slower than not making oneEsta afirmação pode estar errada. Se você estiver fazendo o percurso manual, isso é O(n)operação. Mas se você quiser apenas recuperar um valor pré-calculado, a operação é O(1).