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?
php
arrays
performance
Dexter
fonte
fonte
Respostas:
Bem, podemos olhar a fonte:
PHP_FUNCTION(count)
chamadasphp_count_recursive()
, que por sua vez chamamzend_hash_num_elements()
uma matriz não recursiva, que é implementada desta forma:Então você pode ver, é
O(1)
para$mode = COUNT_NORMAL
.fonte
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.fonte
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,
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, ocount
método desse objeto será chamado.fonte
the count method of that object will be called
, você pode explicar isso um poucoCountable
interface, então chamarcount($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)
.