Matriz PHP: cuenta o tamaño

216

Para encontrar la cantidad de elementos en un PHP $array, ¿cuál es más rápido / mejor / más fuerte?

count($array)o sizeof($array)?

Editar

Gracias a Andy Lester, he refinado mi pregunta para que signifique desde una perspectiva multilingüe. Los comentaristas manuales dicen

"[sizeof] no significa lo mismo en muchos otros lenguajes basados ​​en C"

¿Es esto cierto?

Ben
fuente
72
Una referencia de Daft Punk ... :)
Ben
2
Muy buena pregunta. Pero aquí hay un buen sitio de referencia, que dice que sizeof es solo 21 µs más rápido
sinaneker

Respuestas:

191

Lo usaría count()si son iguales, ya que en mi experiencia es más común y, por lo tanto, hará que menos desarrolladores que lean su código digan " sizeof()¿qué es eso?" y tener que consultar la documentación.

Creo que significa sizeof()que no funciona como lo hace en C (calcular el tamaño de un tipo de datos). Es probable que este hecho mención explícita debido a que PHP está escrito en C, y ofrece una gran cantidad de envoltorios con nombres idénticos para funciones de C ( strlen(), printf(), etc.)

alex
fuente
92

De acuerdo con phpbench :

¿Vale la pena el esfuerzo de calcular la longitud del ciclo por adelantado?

//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);
    //...
}

Se da un bucle con 1000 claves con valores de 1 byte.

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

Por lo tanto, personalmente prefiero usar count () en lugar de sizeof () con precalc .

Reza Baradaran Gazorisangi
fuente
3
Por favor, solo diga cuál toma menos tiempo. ¡De lo contrario, la respuesta es bastante complicada y confusa también! Gracias
Pratik
66
¿con qué versión de php estabas probando? Las versiones más nuevas tienen muchas optimizaciones que pueden hacer que estos resultados sean bastante diferentes
John Hunt,
44
¿Por qué sizeof es más rápido sin guardar su resultado en una variable, sino que es al revés? ¿Es esta una mala elección de diseño en el intérprete de php que causa algún tipo de sobrecarga selectiva? Me gustaría saber cómo comparó esto, la medición de microsegundos me preocupa. tal vez intente ejecutar esto una gran cantidad de veces en un bucle for externo?
FluorescentGreen5
1
¿Qué quieres decir con "pre calc"?
rubo77
1
@ rubo77 Ver el código anterior; "pre-calc" determina el tamaño de la matriz una vez, antes del ciclo for. Sin "pre-calc" está determinando el tamaño de la matriz dentro del ciclo
for
38

Son idénticos según sizeof()

En ausencia de cualquier motivo para preocuparse por "más rápido", siempre optimice para el ser humano. ¿Qué tiene más sentido para el lector humano?

Andy Lester
fuente
19

Según el sitio web, sizeof()es un alias de count(), por lo que deberían estar ejecutando el mismo código. ¿Quizás sizeof()tiene un poco de sobrecarga porque necesita resolverlo count()? Sin embargo, debería ser muy mínimo.

Andy Groff
fuente
53
Bueno, perdón por adivinar? Solo decía que en realidad son lo mismo. Luego, hice una inferencia lógica de que usar un alias para una función en lugar de la función real podría ser mínimamente más lento, pero admití que realmente no tengo idea al prefacio con la palabra "quizás". Lo siento si eso te ofendió. Tal vez la próxima vez use la palabra "infinitesimal".
Andy Groff
8

Sé que esto es viejo, pero solo quería mencionar que probé esto con 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");
?>

y el resultado fue:

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

Así que solo úsalo count().

Mehdi Bounya
fuente
Esto es interesante. ¿Qué versión de PHP usas?
waza
@waza Estoy usando PHP 7.2
Mehdi Bounya
1
Con 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
-2

Utilice la función de conteo. Aquí hay un ejemplo de cómo contar una matriz en un elemento.

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

La count()función devuelve el número de elementos en una matriz.

La sizeof()función devuelve el número de elementos en una matriz.

La sizeof()función es un alias de lacount() función.

Harish rana
fuente