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?


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)


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 .


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?


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.


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().


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


-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.