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 count
está sendo chamado em um array. Se for chamado em um objeto que o implementa, Countable
por exemplo, o count
método desse objeto será chamado.
the count method of that object will be called
, você pode explicar isso um pouco
Countable
interface, 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 one
Esta 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)
.