Array PHP: count ou sizeof?

216

Para encontrar o número de elementos em um PHP $array, qual é mais rápido / melhor / mais forte?

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

Editar

Graças a Andy Lester, refinei minha pergunta a partir de uma perspectiva multilíngue. Os comentaristas do manual dizem

"[sizeof] não significa o mesmo em muitos outros idiomas baseados em C"

Isso é verdade?

Ben
fonte
72
Referência Um Daft Punk ... :)
Ben
2
Muito boa pergunta. Mas aqui é um site boa referência, que diz sizeof é apenas um 21μs mais rápido
sinaneker

Respostas:

191

Eu usaria count()se eles fossem iguais, pois, na minha experiência, é mais comum e, portanto, fará com que menos desenvolvedores que leem seu código digam "o sizeof()que é isso?" e ter que consultar a documentação.

Eu acho que isso significa sizeof()que não funciona como em C (calculando o tamanho de um tipo de dados). Ele provavelmente fez esta menção explícita porque o PHP é escrito em C, e fornece uma grande quantidade de embalagens com nomes idênticos para funções C ( strlen(), printf(), etc.)

alex
fonte
92

De acordo com o phpbench :

Vale a pena o esforço para calcular antecipadamente o comprimento do 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);
    //...
}

Um loop com 1000 teclas com valores de 1 byte é fornecido.

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

Então, eu pessoalmente prefiro usar count () em vez de sizeof () com pré-calc .

Reza Baradaran Gazorisangi
fonte
3
Diga apenas o que leva menos tempo. Senão, a resposta também é bastante complicada e confusa! Obrigado
Pratik
6
com qual versão do php você estava testando? As versões mais recentes têm um monte de otimizações que pode tornar estes resultados bastante diferentes
John Hunt
4
por que o sizeof é mais rápido sem salvar o resultado em uma variável, mas caso contrário é o contrário? isso é uma má escolha de design no intérprete php que causa algum tipo de sobrecarga seletiva? eu gostaria de saber como você fez um benchmarking disso, a medição em microssegundos me preocupa. talvez tente executar isso uma quantidade enorme de vezes em um loop for externo?
FluorescentGreen5
1
o que você quer dizer com "pre calc"?
rubo77
1
@ rubo77 Veja o código acima; "pré-cálculo" está determinando o tamanho da matriz uma vez, antes do loop for. Sem "pré-calc" é a determinação do tamanho da matriz no interior do for-loop
RobIII
38

Eles são idênticos de acordo com sizeof()

Na ausência de qualquer motivo para se preocupar com "mais rápido", sempre otimize para o ser humano. O que faz mais sentido para o leitor humano?

Andy Lester
fonte
19

Segundo o site, sizeof()é um apelido de count(), portanto, eles devem estar executando o mesmo código. Talvez sizeof()tenha um pouco de sobrecarga porque precisa resolvê-lo count()? Deve ser muito mínimo embora.

Andy Groff
fonte
53
Bem, desculpe por adivinhar? Eu estava apenas afirmando que eles são realmente a mesma coisa. Então, fiz uma inferência lógica de que o uso de um pseudônimo para uma função, em vez da função real, pode ser minimamente mais lento, mas admiti que realmente não tenho ideia, prefaciando-a com a palavra "talvez". Desculpe se isso te ofendeu. Talvez da próxima vez usarei a palavra "infinitesimal".
Andy Groff
8

Eu sei que isso é antigo, mas só queria mencionar que tentei isso com o 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 o resultado foi:

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

Então é só usar count().

Mehdi Bounya
fonte
Isto é interessante. Qual versão do PHP você usa?
waza
@waza Estou usando o PHP 7.2
Mehdi Bounya
1
Com 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 22/03/19
6

sizeof()é apenas um pseudônimo de count() como mencionado aqui

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

Mina Ragaie
fonte
4
+ alex sim, sim. Eu vejo dois links. Você esperava que ele reescrevesse sizeof? LOL: p
Gogol
-2

Por favor, use a função de contagem. Aqui está um exemplo de como contar a matriz em um elemento

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

A count()função retorna o número de elementos em uma matriz.

A sizeof()função retorna o número de elementos em uma matriz.

A sizeof()função é um alias da count()função.

Harish rana
fonte