PHP Maniac

Das PHP Blog für PHP-Profis und alle die es werden wollen

Einfach schnelleren PHP Code schreiben

6 Mai, 2009 (19:06) | Grundlagen, Quellcode optimieren, Tipps und Tricks | Von: PHP Maniac

Wer mit Schleifen zu tun hat, die sehr oft wiederholt werden müssen, sollte sich ruhig einmal einige Gedanken zur Vorgehensweise von PHP machen. Durch wenige kleine Änderungen an der richtigen Stelle lassen sich große Geschwindigkeitsvorteile erzielen. Hierbei ist keine schwarze Magie im Spiel und niemand muss den PHP Quelltext verstehen, denn die folgenden Tipps zur PHP Code Optimierung sind leicht verständlich und gut nachvollziehbar.

PHP Schleifen optimieren

Besonders bei for-Schleifen, in denen ja normalerweise immer ein Vergleich als Abbruchbedingung steckt, wird oft sehr viel wertvolle Rechenzeit verschenkt. Schauen wir uns mal eine typische for-Schleife an:

for($i=0;$i<strlen($a);$i++)
{
	//Programmcode
}

Auf den ersten Blick sieht alles gut aus, die Abbruchbedingung ist platzsparend in der for-Schleife untergebracht und alles funktioniert wunderbar. Das Problem ist allerdings, dass zur Auswertung der Abbruchbedingung, welche ja vor jedem Durchlauf geprüft wird, jedesmal die strlen() Funktion ausgeführt werden muss. Dies hat soweit auch seine Richtigkeit, denn die Länge der Variablen $a könnte sich in der Schleife ja geändert haben. Oft ist dem aber nicht so und es wird sehr viel Rechenzeit für das Bestimmen der Stringlänge vergeudet, da sich die Länge ja nie ändert. Die optimierte Version sieht somit wie folgt aus:

$len = strlen($wort);
for($i=0;$i<$len;$i++)
{
	//Programmcode
}

Eine Zeile mehr Programmcode, der bei mehreren zigtausend Durchläufen schnell einige Sekunden oder gar Minuten an Zeit einsparen kann.

Optimierung von (Oder-) Vergleichen

Naturgemäß werden in Schleifen häufig Vergleiche durchgeführt und längst nicht immer geschieht dies nur als Abbruchbedingung in der for-Schleife. Auch herkömmliche Vergleiche in if-Abfragen oder ähnlichem lassen sich leicht optimieren. Hierzu betrachten wir einmal das folgende kleine Beispiel:

while($run)
{
	if(strlen($b) > 5 || $a == true)
	{

	}
}

Besonderes Augenmerkt legen wir hierbei auf die if-Abfrage, die while-Schleife steht stellvertretend für eine sehr oft durchgeführte Wiederholung der if-Abfrage. Wieder ist der Code sauber und lauffähig, jedoch keinesfalls auf Geschwindigkeit optimiert. Der PHP Interpreter wertet Vergleiche nämlich von links nach rechts aus. Sind mehrere Teile eines Vergleichs mit einem Oder Verknüpft, so reicht bereits eine erfolgreiche Überprüfung. In diesem Falle ignoriert der Interpreter die restlichen Vergleiche und optimiert den Code quasi automatisch. Was der Interpreter jedoch nicht weiß: Der strlen() Vergleich dauert deutlich länger als das Prüfen der Variablen $a auf den Wert true. Statt diesen Umstand zu berücksichtigen, fängt PHP mit dem ersten Vergleich links an und arbeitet sich nach rechts durch. Dies können wir leicht ausnutzen, wenn wir den Vergleich mit der geringsten Laufzeit immer ganz links (als erstes) durchführen lassen:

while($run)
{
	if($a == true || strlen($b) > 5)
	{

	}
}

Somit prüft PHP zunächst die Variable $a und nur wenn diese false ist, wird die Stringlänge bestimmt und verglichen. Somit werden im schlimmsten Fall beide Vergleiche durchgeführt, aber immer wenn die Variable $a bereits true ist, spart man sich die Berechnung der Stringlänge. Diese Optimierung macht allerdings nur bei Oder-Verknüpfungen Sinn, denn bei Und prüft der Interpreter natürlich immer alle Vergleiche.

Soviel zum ersten Artikel zu PHP Code Optimierungen. Ich denke auch aus diesem Themengebiet werde ich eine kleine Serie machen, denn es gibt noch viele weitere Kniffe um seinen PHP Code, mit wenig Arbeit, deutlich schneller zu machen.

Be Sociable, Share!

Schreibe einen Kommentar