¿ count()
Realmente cuenta todos los elementos de una matriz PHP, o este valor se almacena en caché en algún lugar y simplemente se recupera?
¿ count()
Realmente cuenta todos los elementos de una matriz PHP, o este valor se almacena en caché en algún lugar y simplemente se recupera?
Respuestas:
Bueno, podemos mirar la fuente:
/ext/standard/array.c
PHP_FUNCTION(count)
llamadas php_count_recursive()
, que a su vez requiere zend_hash_num_elements()
una matriz no recursiva, que se implementa de esta manera:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Entonces puedes ver, es O(1)
para $mode = COUNT_NORMAL
.
IS_CONSISTENT(ht)
Pero qué hace ?
En PHP 5+, la longitud se almacena en la matriz, por lo que el conteo no se realiza cada vez.
EDITAR: También puede encontrar este análisis interesante: PHP Count Performance . Aunque la longitud de la matriz se mantiene mediante la matriz, todavía parece que es más rápido mantenerla si va a llamar count()
muchas veces.
PHP almacena el tamaño de una matriz internamente, pero aún está haciendo una llamada de función cuando es más lento que no hacer una, por lo que querrá almacenar el resultado en una variable si está haciendo algo como usarlo en un lazo:
Por ejemplo,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Además, no siempre puede estar seguro de que count
se está llamando en una matriz. Si se llama a un objeto que se implementa, Countable
por ejemplo, count
se llamará al método de ese objeto.
the count method of that object will be called
, ¿podría explicar esto un poco
Countable
interfaz, entonces llamar count($object)
es lo mismo que llamar $object->count()
. Consulte 3v4l.org/oYSSC, por ejemplo.
you're still making a function call when which is slower than not making one
Esta afirmación puede estar equivocada. Si está haciendo un recorrido manual, eso es O(n)
operación. Pero si solo desea recuperar un valor precalculado, la operación es O(1)
.