PHP Performance Benchmarks & Optimierungstipps
Wahrscheinlichkeit und Komplexität
Die Laufzeit eines Programmes wird maßgeblich durch seine Komplexität, also dem Aufwand, beeinflusst.
Optimierung anhand der Wahrscheinlichkeit
<?php
$i = 0;
while($i < 100000) {
$n = rand(0,3);
if($n == 0)
$i++;
elseif($n == 1)
$i++;
elseif($n == 2)
$i++;
elseif($n == 3)
$i++;
elseif($n == 4)
$i++;
elseif($n == 5)
$i++;
else
$i++;
}
?>
In diesem Beispiel haben wir (unsinnigerweise) den Zufallsgenerator auf Werte zwischen 0 und 3 eingestellt.
<?php
$i = 0;
while($i < 100000) {
$n = rand(0,3);
if($n == 5)
$i++;
elseif($n == 4)
$i++;
elseif($n == 3)
$i++;
elseif($n == 2)
$i++;
elseif($n == 1)
$i++;
elseif($n == 0)
$i++;
else
$i++;
}
?>
Wir wissen und sehen, dass der zweite Fall der unwahrscheinlicher ist, da die ersten 2 Bedingungen niemals erreicht werden.
genau diese überspringen (überprüfen) kostet Zeit. Im ersten Fall ist die Reihenfolge andersrum, was eine bessere Ausnutzung der Wahrscheinlichkeit darstellt.
| Variante | Laufzeit | Verhältnis |
| mehr Wahrscheinlich | 66.409111 ms | 100% |
| weniger Wahrscheinlich | 73.75598 ms | 111% |
Optimierung anhand der Laufzeit
In diesem Beispiel werden in einer If-Bedingung zwei Funktionen oder-verknüpft überprüft.
<?php
if(langsamer() || schneller()) {
return;
}
?>
Der Interpreter geht bei UND- und ODER-Verknüpfungen nach dem "LazyEnd"-Prnzip von links nach rechts vor, d.h. bei ODER (||) muss nur eine Bedingung "true" sein um in den Anweisungsteil zu springen, bei UND (&&) wird die ganze If-Bedingung nach einem "false" abgebrochen.
<?php
if(schneller() || langsamer()) {
return;
}
?>
Die zweite Variante wird schneller ausgeführt, da hier die schnellere Funktion zuerst aufgerufen wird; die langsame Funktion wird garnicht erst aufgerufen, da die Bedingungen schon erfüllt sind.
| Variante | Laufzeit | Verhältnis |
| schneller() | 10.571957 ms | 100% |
| langsamer() | 105.272055 ms | 996% |