¿El count()
realmente cuenta todos los elementos de una matriz de PHP, o este valor está almacenado en la memoria caché en algún lugar y solo se recupera?¿La función count() de PHP es O (1) u O (n) para matrices?
Respuesta
Bueno, podemos mirar a la fuente:
/ext/standard/array.c
PHP_FUNCTION(count)
llamadas php_count_recursive()
, que a su vez llama zend_hash_num_elements()
de matriz no recursivo, que se realiza de esta manera:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Para que pueda ver, es O(1)
para $mode = COUNT_NORMAL
.
¿Qué hace 'IS_CONSISTENT (ht)' hacer sin embargo? – Matthew
¡Gracias! No estaba muy seguro de dónde debería buscar la fuente o dónde obtener la fuente (sin tener que verificarlo desde un repositorio). – Dexter
@Matt Está comprobando si la estructura hash es válida, como puedo ver. Está definido en zend_hash.c y también es O (1). –
En PHP 5+ la longitud se almacena en la matriz por lo que el recuento no se realiza cada vez.
EDITAR: También puede encontrar este análisis interesante: PHP Count Performance. Aunque la matriz mantiene la longitud de la matriz, todavía parece que es más rápido conservarla si va a llamar al count()
muchas veces.
Creo que puede tener la certeza de que el cambio se realizó a partir de PHP 5. Sin embargo, aún no he encontrado la prueba de que PHP 4 fuera O (n) para count(); Acabo de ver comentarios anecdóticos. ¿Puede encontrar pruebas (es decir, la implementación de count() para PHP 4)? Gracias, –
PHP almacena el tamaño de una matriz internamente, pero todavía está haciendo una llamada a función cuando es más lenta que no hacer una, por lo que querrá almacenar el resultado en una variable si está haciendo algo como se utiliza en un bucle:
Por ejemplo,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Además, no siempre se puede estar seguro de count
se está llamando en una matriz. Si se invoca un objeto que implementa Countable
por ejemplo, se llamará al método count
de ese objeto.
Como seguimiento es posible que desee leer http://josephscott.org/archives/2010/01/php-count-performance/ Básicamente, detalla cómo obtener la longitud de la matriz es o (1) y el impacto de la llamadas a funciones repetidas. – TheClair
está haciendo una llamada de función siempre más lenta que no hacer una? No me sorprendería que el intérprete tenga una optimización en línea. – corsiKa
'se llamará el método de conteo de ese objeto', ¿puede explicar esto un poco –
- 1. ¿Debería considerar memmove() O (n) u O (1)?
- 2. ¿Cambia el bit O (1) u O (n)?
- 3. ¿Cuál es la prueba de (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 4. Rails SQL COUNT N + 1 ineficiencia
- 5. Cómo realizar COUNT() o COUNT (*)
- 6. ¿Es string.ElementAt() O (1)?
- 7. ¿Qué significa esto: O (n) pasos y O (1) espacio?
- 8. En Java, para una cadena x, ¿cuál es el costo de tiempo de ejecución de s.length()? ¿Es O (1) u O (n)?
- 9. SQL & PHP - ¿Cuál es más rápido mysql_num_rows() o 'select count()'?
- 10. "Índice n nulo para este SqlParameterCollection con Count = n" O "clave foránea no puede ser nulo"
- 11. ¿Es O (log n) siempre más rápido que O (n)
- 12. .NET o PHP, ¿Corporativo u Open-Source?
- 13. SQL Mejor Práctica: count (1) o el recuento (*)
- 14. Mysql resultados en PHP - matrices u objetos?
- 15. probar n = Big-O (1) usando la inducción
- 16. ¿Cuál es la gran función O de Oracles MAX?
- 17. Concatenar valores de n matrices en php
- 18. ¿Qué es O (log * N)?
- 19. Ejemplo de O (n!)?
- 20. ¿Por qué se pasa del planificador O (1) al CFS que es O (log N)?
- 21. ¿Cuál es la diferencia entre '\ n' o "\ n" en C++?
- 22. Diferencia entre O (n) y O (log (n)) - ¿cuál es mejor y qué es exactamente O (log (n))?
- 23. Función PHP Count con Matriz Asociativa
- 24. ¿Podemos calcular esto en menos de O (n * n) ... (nlogn o n)
- 25. El peor caso de clasificación de burbuja es O (n * n), ¿cómo?
- 26. ¿Matrices ASLOCATABLE o matrices de POINTER?
- 27. ¿Debo devolver 0 o 1 para una función exitosa?
- 28. Php Framework o motor de plantilla u otra cosa?
- 29. PHP o HTML primero o ¿es importante?
- 30. ¿Existe un término abreviado para O (n log n)?
¿Por qué no probarlo? es lo suficientemente simple como para hacer un ciclo que agrega elementos a una matriz y cuenta cada vez y realiza algún tiempo. –
Eche un vistazo a esta pregunta: http://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions –
Palabras clave de Google: esta pregunta también podría formularse como: Cuenta PHP() itera sobre la matriz o recupera la cuenta de la propiedad de la matriz? –