Tablica PHP: liczba czy rozmiar?

216

Aby znaleźć liczbę elementów w PHP $array, który jest szybszy / lepszy / silniejszy?

count($array)czy sizeof($array)?

Edytować

Dzięki Andy'emu Lesterowi dopracowałem moje pytanie z wielojęzycznego punktu widzenia. Komentatorzy manualni mówią

„[sizeof] nie oznacza tego samego w wielu innych językach opartych na C”

Czy to prawda?

Ben
źródło
72
Odniesienie do Daft Punk ... :)
Ben,
2
Bardzo miłe pytanie. Ale tutaj jest dobra strona porównawcza, która mówi, że sizeof jest tylko 21µs szybszy
sinaneker 10.08.13

Odpowiedzi:

191

Użyłbym count()ich, jeśli są takie same, ponieważ z mojego doświadczenia wynika, że ​​jest to bardziej powszechne i dlatego sprawi, że mniej programistów czytających twój kod powie „ sizeof()co to jest?” i konieczność zapoznania się z dokumentacją.

Myślę, że to znaczy, sizeof()że nie działa tak jak w C (obliczanie wielkości typu danych). To zapewne ten wspomina wyraźnie, ponieważ PHP jest napisany w C i zapewnia dużo identycznie nazwanych owijarki do funkcji C ( strlen(), printf()itp)

alex
źródło
92

Według phpbench :

Czy warto z góry obliczyć długość pętli?

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

Podana jest pętla z 1000 kluczami o wartości 1 bajtu.

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

Więc osobiście wolę używać count () zamiast sizeof () z wcześniejszymi obliczeniami .

Reza Baradaran Gazorisangi
źródło
3
Podaj tylko, które zajmuje mniej czasu. W przeciwnym razie odpowiedź jest dość skomplikowana i myląca! Dzięki
Pratik,
6
z jaką wersją php testowałeś? Nowsze wersje mają wiele optymalizacji, które mogą sprawić, że te wyniki będą zupełnie inne
John Hunt
4
dlaczego sizeof jest szybszy bez zapisywania wyniku w zmiennej, ale w przeciwnym razie jest odwrotnie? czy jest to zły wybór projektu interpretera php, który powoduje jakieś selektywne koszty ogólne? Chciałbym wiedzieć, w jaki sposób przeprowadziliście testy porównawcze, niepokoi mnie pomiar w mikrosekundach. może spróbuj uruchomić to ogromną ilość razy w zewnętrznej pętli for?
FluorescentGreen5
1
co masz na myśli przez „pre calc”?
rubo77
1
@ rubo77 Zobacz powyższy kod; „pre-calc” określa wielkość tablicy raz, przed pętlą for. Bez „pre-calc” określa się rozmiar tablicy wewnątrz pętli
for
38

Są identyczne zgodnie z sizeof()

W przypadku braku jakiegokolwiek powodu do martwienia się o „szybsze”, zawsze optymalizuj dla człowieka. Co ma sens dla ludzkiego czytelnika?

Andy Lester
źródło
19

Według strony internetowej sizeof()jest to alias count(), więc powinny one uruchamiać ten sam kod. Być może sizeof()ma trochę narzutów, ponieważ musi to rozwiązać count()? Powinno to być jednak bardzo minimalne.

Andy Groff
źródło
53
Przepraszam za zgadywanie? Po prostu stwierdziłem, że tak naprawdę to to samo. Następnie dokonałem logicznego wniosku, że użycie aliasu dla funkcji zamiast rzeczywistej funkcji może być bardzo minimalnie wolniejsze, ale przyznałem, że tak naprawdę nie mam pojęcia, zastępując ją słowem „być może”. Przepraszam, jeśli cię to obraziło. Może następnym razem użyję słowa „nieskończenie mały”.
Andy Groff,
8

Wiem, że to stare, ale chciałem tylko wspomnieć, że próbowałem tego z 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");
?>

a wynik był:

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

Więc po prostu użyj count().

Mehdi Bounya
źródło
To jest interesujące. Jakiej wersji PHP używasz?
waza
@waza Używam PHP 7.2
Mehdi Bounya
1
Z 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()jest tylko aliasem, count() jak wspomniano tutaj

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

Mina Ragaie
źródło
4
+ alex tak to robi. Widzę dwa linki. Czy spodziewałeś się, że przepisał rozmiar sizeof? LOL: p
Gogol
-2

Proszę użyć funkcji liczenia, oto przykład liczenia tablicy w elemencie

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

count()Zwraca liczbę elementów macierzy.

sizeof()Zwraca liczbę elementów macierzy.

sizeof()Funkcja jest aliasem count()funkcji.

Harish Rana
źródło