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 | 4.868984 ms | 100% |
weniger Wahrscheinlich | 5.353928 ms | 110% |
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() | 0.28491 ms | 100% |
langsamer() | 2.889872 ms | 1014% |