Tableau PHP: nombre ou taille de?

216

Pour trouver le nombre d'éléments dans un PHP $array, qui est plus rapide / meilleur / plus fort?

count($array)ou sizeof($array)?

Éditer

Grâce à Andy Lester, j'ai affiné ma question pour qu'elle soit signifiée dans une perspective multilingue. Les commentateurs du manuel disent

"[sizeof] ne signifie pas la même chose dans de nombreuses autres langues basées sur C"

Est-ce vrai?

Ben
la source
72
Une référence Daft Punk ... :)
Ben
2
Très belle question. Mais voici un bon site de référence, qui dit que sizeof est juste 21µs plus rapide
sinaneker

Réponses:

191

Je les utiliserais count()s'ils sont les mêmes, car selon mon expérience, c'est plus courant, et par conséquent, moins de développeurs liront votre code pour dire " sizeof(), qu'est-ce que c'est?" et devoir consulter la documentation.

Je pense que cela signifie que sizeof()cela ne fonctionne pas comme en C (calcul de la taille d'un type de données). Il a probablement fait cette mention explicitement parce que PHP est écrit en C et fournit beaucoup d'emballages pour les fonctions de même nom (C strlen(), printf(), etc.)

alex
la source
92

Selon phpbench :

Vaut-il la peine de calculer à l'avance la longueur de la boucle?

//pre-calculate the size of array
$size = count($x); //or $size = sizeOf($x);

for ($i=0; $i<$size; $i++) {
    //...
}

//don't pre-calculate
for ($i=0; $i<count($x); $i++) { //or $i<sizeOf($x);
    //...
}

Une boucle avec 1000 clés avec des valeurs de 1 octet est donnée.

                  +---------+----------+
                  | count() | sizeof() |
+-----------------+---------+----------+
| With precalc    |     152 |      212 |
| Without precalc |   70401 |    50644 |
+-----------------+---------+----------+  (time in µs)

Donc, je préfère personnellement utiliser count () au lieu de sizeof () avec pré calc .

Reza Baradaran Gazorisangi
la source
3
Veuillez indiquer uniquement ce qui prend moins de temps. Sinon, la réponse est assez compliquée et déroutante aussi! Merci
Pratik
6
avec quelle version de php testiez-vous? Les nouvelles versions ont beaucoup d'optimisations qui peuvent rendre ces résultats très différents
John Hunt
4
pourquoi sizeof est-il plus rapide sans enregistrer son résultat dans une variable mais sinon c'est l'inverse? est-ce un mauvais choix de conception dans l'interpréteur php qui provoque une sorte de surcharge sélective? je voudrais savoir comment vous avez comparé cela, la mesure en microsecondes m'inquiète. essayez peut-être d'exécuter cela énormément de fois dans une boucle for externe?
FluorescentGreen5
1
que voulez-vous dire par «pré-calc»?
rubo77
1
@ rubo77 Voir le code ci-dessus; "pre-calc" détermine la taille du tableau une fois, avant la boucle for. Sans «pré-calc», c'est la détermination de la taille du tableau à l'intérieur de la boucle
for
38

Ils sont identiques selon sizeof()

En l'absence de toute raison de s'inquiéter de "plus vite", toujours optimiser pour l'humain. Qu'est-ce qui a plus de sens pour le lecteur humain?

Andy Lester
la source
19

Selon le site Web, sizeof()est un alias de count(), ils devraient donc exécuter le même code. Peut-être sizeof()a un peu de frais généraux, car il doit le résoudre count()? Cela devrait cependant être très minime.

Andy Groff
la source
53
Eh bien, désolé d'avoir deviné? Je disais simplement que c'est en fait la même chose. Ensuite, j'ai fait une déduction logique selon laquelle l'utilisation d'un alias pour une fonction au lieu de la fonction réelle pourrait être très peu plus lente, mais j'ai admis que je n'en ai vraiment aucune idée en la faisant précéder du mot «peut-être». Désolé si cela vous a offensé. Peut-être que la prochaine fois j'utiliserai le mot «infinitésimal».
Andy Groff
8

Je sais que c'est vieux mais je voulais juste mentionner que j'ai essayé avec PHP 7.2:

<?php
//Creating array with 1 000 000 elements
$a = array();
for ($i = 0; $i < 1000000; ++$i)
{
    $a[] = 100;
}

//Measure
$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = count($a);
}
print("1 000 000 000 iteration of count() took ".(time()-$time)." sec\n");

$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = sizeof($a);
}
print("1 000 000 000 iteration of sizeof() took ".(time()-$time)." sec\n");
?>

et le résultat a été:

1 000 000 000 iteration of count() took 414 sec
1 000 000 000 iteration of sizeof() took 1369 sec

Il suffit donc d'utiliser count().

Mehdi Bounya
la source
C'est intéressant. Quelle version PHP utilisez-vous?
waza
@waza J'utilise PHP 7.2
Mehdi Bounya
1
Avec PHP 7.3.3: 1 000 000 000 iteration of count() took 525 sec 1 000 000 000 iteration of sizeof() took 1361 sec
AnthonyB
6

sizeof()est juste un alias count() comme mentionné ici

http://php.net/manual/en/function.sizeof.php

Mina Ragaie
la source
4
+ alex oui c'est le cas. Je vois deux liens. Vous attendiez-vous à ce qu'il réécrive sizeof? LOL: p
Gogol
-2

Veuillez utiliser la fonction de comptage, voici un exemple comment compter le tableau dans un élément

$cars = array("Volvo","BMW","Toyota");
echo count($cars);

La count()fonction renvoie le nombre d'éléments dans un tableau.

La sizeof()fonction renvoie le nombre d'éléments dans un tableau.

La sizeof()fonction est un alias de la count()fonction.

Harish rana
la source