Was ist schneller in PHP, eine große switch-Anweisung zu machen oder ein Array einzurichten und den Schlüssel nachzuschlagen?
Bevor Sie jetzt antworten, ist mir bewusst, dass das Array für reine Suchen schneller ist. Dies setzt jedoch voraus, dass das Array nur einmal erstellt und dann wiederholt nachgeschlagen wird.
Aber das mache ich nicht – jeder Durchlauf des Codes ist neu, und das Array wird verwendet nur einmal jedes Mal. Daher müssen alle Array-Hashes jedes Mal neu berechnet werden, und ich frage mich, ob diese Einrichtung langsamer ist als einfach eine switch
Aussage.
Ich habe einige Tests gemacht:
Datei array_gen.php
<?
echo '<?
$a = 432;
$hash = array(
';
for($i = 0; $i < 10000; $i++)
echo "$i => $i,\n";
echo ');
echo $hash[$a];
';
Datei switch_gen.php:
<?
echo '<?
$a = 432;
switch($a) {
';
for($i = 0; $i < 10000; $i++)
echo "case $i: echo $i; break;\n";
echo '}';
Dann:
php array_gen.php > array_.php
php switch_gen.php > switch.php
time tcsh -c 'repeat 1000 php array.php > /dev/null'
19.297u 4.791s 0:25.16 95.7%
time tcsh -c 'repeat 1000 php switch.php > /dev/null'
25.081u 5.543s 0:31.66 96.7%
Dann habe ich die Schleife geändert zu:
for($i = 'a'; $i < 'z'; $i++)
for($j = 'a'; $j < 'z'; $j++)
for($k = 'a'; $k < 'z'; $k++)
Um 17576 zu erstellen, 3 Buchstabenkombinationen.
time tcsh -c 'repeat 1000 php array.php > /dev/null'
30.916u 5.831s 0:37.85 97.0%
time tcsh -c 'repeat 1000 php switch.php > /dev/null'
36.257u 6.624s 0:43.96 97.5%
Die Array-Methode gewinnt jedes Mal, selbst wenn Sie die Einrichtungszeit einbeziehen. Aber nicht viel. Ich denke also, ich werde diese Optimierung ignorieren und mich für das entscheiden, was einfacher ist.
Es hängt irgendwie von der Arraygröße ab, aber für die meisten praktischen Zwecke können Sie davon ausgehen, dass das Array schneller ist. Der Grund ist einfach; eine switch-Anweisung muss sequenziell mit jedem Eintrag in der switch-Anweisung vergleichen, aber der Array-Ansatz nimmt einfach den Hash und findet diesen Eintrag. Wenn Sie so wenige Einträge in Ihrem Switch haben, dass die sequentiellen Vergleiche schneller sind als das Hashing, ist es schneller, einen Switch zu verwenden, aber der Array-Ansatz wird schnell effizienter. In der Informatik geht es um O(n) vs. O(1).
Versuch es. Schreiben Sie ein PHP-Skript, um jede Methode einige 100.000 Mal auszuführen, und geben Sie die Dauer für jede der beiden Methoden aus. Diese Art von Optimierungen machen auf lange Sicht jedoch selten einen signifikanten Unterschied.
– Rich Adams
27. Juli 2011 um 23:59 Uhr
“Spielt es überhaupt eine Rolle”? Wenn es dann keine Leistungsanalyse gegeben hat – nein, tut es nicht. Verwenden Sie, was übersichtlicher und wartbarer ist. (Es kann keines der oben genannten sein).
– Benutzer166390
28. Juli 2011 um 0:00 Uhr
Diese Leistungsoptimierungen werden auf lange Sicht wahrscheinlich nicht viele Ergebnisse bringen, vielleicht ein paar Millisekunden oder so. Wenn Sie dies tatsächlich in einer groß angelegten Umgebung bereitstellen, werden diese Optimierungen aufgrund der Rechenleistung, die Sie erhalten, wahrscheinlich vernachlässigbar sein. Allerdings nur meine Meinung. Probieren Sie es aus und sehen Sie. Führen Sie einen Stresstest durch. Experimentieren ist der Weg, um die Antwort zu bekommen 🙂
– Jimmie Lin
28. Juli 2011 um 0:15 Uhr
Ich habe keine Leistungsanalyse versucht, aber ich würde annehmen, dass die Mikrooptimierung darin bestehen würde, die Hashes zu speichern, damit die Hashes nicht jedes Mal neu berechnet werden müssen.
– Erinnerung
28. Juli 2011 um 0:20 Uhr
@jared-farrish Ich könnte meinen Code auf zwei Arten erstellen, also würde ich wählen, was schneller ist. (Zumindest wenn es einen großen Unterschied gab.)
– Arielle
28. Juli 2011 um 0:28 Uhr