Matrice PHP: conteggio o dimensione di?


216

Per trovare il numero di elementi in un PHP $array, che è più veloce / migliore / più forte?

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

modificare

Grazie ad Andy Lester, ho perfezionato la mia domanda con un punto di vista multilingue. Dicono i commentatori manuali

"[sizeof] non significa lo stesso in molte altre lingue basate su C"

È vero?


72
Un riferimento da Daft Punk ... :)
Ben

2
Bella domanda Ma ecco un buon sito di riferimento, che dice che sizeof è solo un 21µs più veloce
sinaneker

Risposte:


191

Userei count()se sono uguali, poiché nella mia esperienza è più comune, e quindi causerà meno sviluppatori che leggono il tuo codice per dire " sizeof(), che cos'è?" e dover consultare la documentazione.

Penso che significhi sizeof()che non funziona come in C (calcolo della dimensione di un tipo di dati). Probabilmente ha fatto questa menzione esplicitamente perché PHP è scritto in C, e fornisce un sacco di involucri con lo stesso nome per funzioni C ( strlen(), printf(), ecc)


92

Secondo phpbench :

Vale la pena di calcolare in anticipo la lunghezza del loop?

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

Viene fornito un loop con 1000 chiavi con valori di 1 byte.

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

Quindi personalmente preferisco usare count () invece di sizeof () con pre calc .


3
Si prega di dire solo che richiede meno tempo. Altrimenti la risposta è alquanto complicata e confusa! Grazie
Pratik,

6
con quale versione di php stavi testando? Le versioni più recenti hanno molte ottimizzazioni che possono rendere questi risultati abbastanza diversi
John Hunt,

4
perché sizeof è più veloce senza salvare il suo risultato in una variabile ma altrimenti è il contrario? è questa una cattiva scelta progettuale nell'interprete php che provoca una sorta di overhead selettivo? Mi piacerebbe sapere come hai confrontato questo, la misurazione dei microsecondi mi preoccupa. forse provare a eseguirlo un numero enorme di volte in un ciclo esterno per?
FluorescentGreen5

1
cosa intendi con "pre calc"?
rubo77,

1
@ rubo77 Vedi il codice sopra; "pre-calc" sta determinando la dimensione dell'array una volta, prima del for-loop. Senza "pre-calc" si determina la dimensione dell'array all'interno del for-loop
RobIII

38

Sono identici secondo sizeof()

In assenza di qualsiasi motivo per preoccuparsi di "più veloce", ottimizzare sempre per l'essere umano. Cosa ha più senso per il lettore umano?


19

Secondo il sito Web, sizeof()è un alias di count(), quindi dovrebbero eseguire lo stesso codice. Forse sizeof()ha un po 'di sovraccarico perché deve risolverlo count()? Dovrebbe essere molto minimale però.


53
Beh, scusa per aver indovinato? Stavo solo affermando che in realtà sono la stessa cosa. Quindi, ho fatto una logica deduzione sul fatto che l'uso di un alias per una funzione anziché la funzione effettiva potrebbe essere minimamente più lento, ma ho ammesso che non ho davvero idea di averlo preceduto dalla parola "forse". Scusa se ti ho offeso. Forse la prossima volta userò la parola "infinitesimale".
Andy Groff,

8

So che questo è vecchio ma volevo solo menzionare che ho provato questo 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");
?>

e il risultato fu:

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

Quindi basta usare count().


Questo è interessante. Quale versione di PHP usi?
waza,

@waza Sto usando PHP 7.2
Mehdi Bounya il

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

Utilizzare la funzione di conteggio, ecco un esempio di come contare l'array in un elemento

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

La count()funzione restituisce il numero di elementi in un array.

La sizeof()funzione restituisce il numero di elementi in un array.

La sizeof()funzione è un alias della count()funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.