92 votes

Le compte PHP (), O (1) ou O (n) pour les tableaux?

savez-vous si count () en PHP compte vraiment tous les éléments d'un tableau PHP, ou si cette valeur est mise en cache quelque part et doit simplement être récupérée?

Les docs ne disent pas grand-chose à ce sujet et les différents articles de blog qui mesurent les performances de count () n'en parlent pas non plus.

(Désolé pour le titre, je ne savais pas comment le décrire plus précisément.)

128voto

FractalizeR Points 12887

Eh bien, nous pouvons chercher à la source:

/ext/standard/matrice.c

PHP_FUNCTION(count) des appels php_count_recursive(), qui à son tour appelle zend_hash_num_elements() pour les non-récursif de la matrice, ce qui est mis en œuvre cette manière:

ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
    IS_CONSISTENT(ht);

    return ht->nNumOfElements;
}

De sorte que vous pouvez le voir, O(1) pour $mode = COUNT_NORMAL.

7voto

jberg Points 2246

En PHP 5+, la longueur est stockée dans le tableau, donc le comptage n'est pas effectué à chaque fois.

EDIT: Vous pouvez é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 appelez count() plusieurs fois.

4voto

mfonda Points 4507

PHP magasins de la taille d'un tableau à l'interne, mais vous êtes toujours en train de faire un appel de fonction lorsqu'qui est plus lent que de ne pas en faire un, de sorte que vous aurez envie de stocker le résultat dans une variable si vous êtes en train de faire quelque chose comme de l'utiliser dans une boucle:

Par exemple,

$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
   foo($array[$i]);
}

En outre, vous ne pouvez pas toujours être sûr de count est appelé sur un tableau. Si elle est appelée sur un objet qui implémente Countable par exemple, l' count méthode de cet objet sera appelée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X