PHP-Array: Anzahl oder Größe von?

216

Um die Anzahl der Elemente in einem PHP zu finden $array, welches ist schneller / besser / stärker?

count($array)oder sizeof($array)?

Bearbeiten

Dank Andy Lester habe ich meine Frage aus einer mehrsprachigen Perspektive heraus verfeinert. Die manuellen Kommentatoren sagen

"[sizeof] bedeutet in vielen anderen Sprachen, die auf C basieren, nicht dasselbe."

Ist das wahr?

Ben
quelle
72
Eine Daft Punk Referenz ... :)
Ben
2
Sehr schöne Frage. Aber hier ist eine gute Benchmark-Site, die besagt, dass sizeof nur 21µs schneller ist
sinaneker

Antworten:

191

Ich würde verwenden, count()wenn sie gleich sind, wie es meiner Erfahrung nach häufiger vorkommt, und daher weniger Entwickler, die Ihren Code lesen, sagen: " sizeof()Was ist das?" und die Dokumentation konsultieren müssen.

Ich denke, es bedeutet, dass sizeof()es nicht wie in C funktioniert (Berechnung der Größe eines Datentyps). Es machte wahrscheinlich diese Erwähnung ausdrücklich , weil PHP in C geschrieben ist, und bietet eine Vielzahl von identischen Namen Wrapper für C - Funktionen ( strlen(), printf()usw.)

Alex
quelle
92

Laut phpbench :

Lohnt es sich, die Länge der Schleife im Voraus zu berechnen?

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

Es wird eine Schleife mit 1000 Schlüsseln mit 1-Byte-Werten angegeben.

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

Ich persönlich bevorzuge es, count () anstelle von sizeof () mit pre calc zu verwenden .

Reza Baradaran Gazorisangi
quelle
3
Bitte sagen Sie nur, was weniger Zeit in Anspruch nimmt. Sonst ist die Antwort ziemlich kompliziert und verwirrend! Danke
Pratik
6
Mit welcher Version von PHP haben Sie getestet? Neuere Versionen haben viele Optimierungen, die diese Ergebnisse ganz anders machen können
John Hunt
4
Warum ist sizeof schneller, ohne das Ergebnis in einer Variablen zu speichern, aber sonst ist es umgekehrt? Ist dies eine schlechte Design-Wahl im PHP-Interpreter, die einen selektiven Overhead verursacht? Ich würde gerne wissen, wie Sie dies verglichen haben. Die Mikrosekundenmessung macht mir Sorgen. Vielleicht versuchen Sie es so oft in einer äußeren for-Schleife?
FluorescentGreen5
1
was meinst du mit "pre calc"?
rubo77
1
@ rubo77 Siehe den obigen Code; "pre-calc" bestimmt die Größe des Arrays einmal vor der for-Schleife. Ohne "Vorberechnung" wird die Größe des Arrays innerhalb der for-Schleife bestimmt
RobIII
38

Sie sind identisch nach sizeof()

Optimieren Sie immer für den Menschen, wenn Sie keinen Grund haben, sich über "schneller" Gedanken zu machen. Was macht für den menschlichen Leser mehr Sinn?

Andy Lester
quelle
19

Laut der Website sizeof()ist ein Alias ​​von count(), daher sollten sie den gleichen Code ausführen. Vielleicht sizeof()hat ein bisschen Overhead, weil es es lösen muss count()? Es sollte jedoch sehr minimal sein.

Andy Groff
quelle
53
Tut mir leid, dass ich geraten habe? Ich habe nur gesagt, dass sie tatsächlich dasselbe sind. Dann machte ich eine logische Schlussfolgerung, dass die Verwendung eines Alias ​​für eine Funktion anstelle der eigentlichen Funktion möglicherweise nur minimal langsamer ist, gab jedoch zu, dass ich wirklich keine Ahnung habe, indem ich ihm das Wort "vielleicht" voranstelle. Entschuldigung, wenn dich das beleidigt hat. Vielleicht verwende ich das nächste Mal das Wort "infinitesimal".
Andy Groff
8

Ich weiß, dass dies alt ist, wollte aber nur erwähnen, dass ich dies mit PHP 7.2 versucht habe :

<?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");
?>

und das Ergebnis war:

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

Also einfach benutzen count().

Mehdi Bounya
quelle
Das ist interessant. Welche PHP-Version verwenden Sie?
Waza
@waza Ich benutze PHP 7.2
Mehdi Bounya
1
Mit 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()ist nur ein Alias ​​von count() wie hier erwähnt

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

Mina Ragaie
quelle
4
+ alex ja das tut es. Ich sehe zwei Links. Haben Sie erwartet, dass er sizeof umschreibt? LOL: p
Gogol
-2

Bitte verwenden Sie die Zählfunktion. Hier ist ein Beispiel für das Zählen von Arrays in einem Element

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

Die count()Funktion gibt die Anzahl der Elemente in einem Array zurück.

Die sizeof()Funktion gibt die Anzahl der Elemente in einem Array zurück.

Die sizeof()Funktion ist ein Alias ​​der count()Funktion.

Harish Rana
quelle