count()
Compte- t-il vraiment tous les éléments d'un tableau PHP, ou cette valeur est-elle mise en cache quelque part et est simplement récupérée?
count()
Compte- t-il vraiment tous les éléments d'un tableau PHP, ou cette valeur est-elle mise en cache quelque part et est simplement récupérée?
Réponses:
Eh bien, nous pouvons regarder la source:
/ext/standard/array.c
PHP_FUNCTION(count)
appelle php_count_recursive()
, qui à son tour appelle zend_hash_num_elements()
un tableau non récursif, qui est implémenté de cette façon:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Donc vous pouvez voir, c'est O(1)
pour $mode = COUNT_NORMAL
.
IS_CONSISTENT(ht)
Mais que fait -on?
En PHP 5+, la longueur est stockée dans le tableau donc le comptage n'est pas fait à chaque fois.
EDIT: Vous pourriez également trouver cette analyse intéressante: PHP Count Performance . Bien que la longueur du tableau soit maintenue par le tableau, il semble toujours qu'il soit plus rapide de le conserver si vous prévoyez d'appeler count()
plusieurs fois.
PHP stocke la taille d'un tableau en interne, mais vous faites toujours un appel de fonction quand ce qui est plus lent que de ne pas en faire un, vous voudrez donc stocker le résultat dans une variable si vous faites quelque chose comme l'utiliser dans un boucle:
Par exemple,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
De plus, vous ne pouvez pas toujours être sûr qu'il count
est appelé sur un tableau. S'il est appelé sur un objet implémentant Countable
par exemple, la count
méthode de cet objet sera appelée.
the count method of that object will be called
, pouvez-vous s'il vous plaît expliquer ceci un peu
Countable
interface, alors l'appel count($object)
est la même chose que l'appel $object->count()
. Voir 3v4l.org/oYSSC par exemple.
you're still making a function call when which is slower than not making one
Cette déclaration peut être fausse. Si vous effectuez une traversée manuelle, c'est l' O(n)
opération. Mais si vous souhaitez simplement récupérer une valeur pré-calculée, l'opération l'est O(1)
.