Schneller, PHP! Schneller!

PHP rockt. PHP ist objektorientiert. PHP ist schnell. Mit folgenden Ansätzen lässt sich die Geschwindigkeit der PHP-Anwendungen um mindestens 15% steigern. Mit zahlreichen Beispielen zum Testen und mit realen Ausführungszeiten zum Vergleichen. Los, PHP optimieren.

A. Variablen und Text trennen (Performance-Gewinn 25-40%)
Ob eine Variable von Anführungszeichen umschlossen ist oder nicht, ist für PHP und seinen Parser von großer Bedeutung. Hier die durchgeführten Vergleiche:

Ausgeführter Code

 {$x=”test”.$test;}
{$x=”test $test”;}
{$x=”test”;$x.=$test;}

Ausführungszeiten (ms)

3.5911
5.0616
4.9870

Wie aus dem Test ersichtlich, sollten solche Zuweisungsarten à la $a=”$b” vermieden werden, da hier beim Ausführen des Codes zur deutlichen Verzögerung (durchschnittlich 40%) kommen kann.

Um die Problematik zu verdeutlichen, werden weitere Befehle mit demonstrativ mehr Zuweisungen innerhalb des Codes gegenüber gestellt und ausgewertet. Auch hier ist die Lösung mit separierten Variablen und nur einer Zuweisung die prompteste.

Ausgeführter Code

      {$x=”test “.$test.” test “.$test.” test “.$test;}
{$x=”test $test test $test test $test”;}
{$x=”test “;$x.=$test;$x=”test “;$x.=$test;$x=”test “;$x.=$test;}

Ausführungszeiten (ms)

7.6894
9.5515
11.6506

Aus Erfahrung: im besten Fall wird der Text in einfachen Anführungszeichen (zwischen solchen Albgrenzern sucht PHP von Haus aus nach keinen Variablen und ist somit deutlich schneller) notiert, gefolgt von der Variable selbst.

B. Array-Werte und Text trennen (Performance-Gewinn 25-30%)
Für Arrays gilt die vorher besprochene Strategie selbstverständlich auch. Wie die folgenden Testresultate zeigen, leiden besonders mehrdimensionale Arrays unter der Zusammenlegung mit dem Text:

Ausgeführter Code

      {$x=”test “.$myarray[”name”][”second”][1].” test”;}
{$x=”test {$myarray[name][second][1]} test”;}
{$x=”test “;$x.=$myarray[”name”][”second”][1];$x=” test”;}

Ausführungszeiten (ms)
3.5369
5.0605
4.6017

Bei einfachen Konstrukten ist der Mischmasch nicht ganz so schlimm, sollte in der Praxis jedoch nicht angewendet werden – schon wegen der Lesbarkeit:

Ausgeführter Code

      {$x=”test“.$myarray[”test”].”test”;}
{$x=”test$myarray[test]test”;}
{$x=”test{$myarray[test]}test”; }

Ausführungszeiten (ms)
2.8495
2.9519
3.5202

C. Namen der Variablen kürzer 8 Zeichen (Performance-Gewinn 15%)
In den meisten Fällen wird der Name einer Variable vom Entwickler sorgfältig ausgesucht, denn auch nach 2.000 Zeilen Code soll dieser verraten, wofür genau eine bestimmte Variable da ist und was für einen Wert sie in sich trägt. Doch Vorsicht: Je länger der Name, desto länger braucht das Script zum Ausführen der anvertrauten Aufgaben.

Ausgeführter Code

      {$x=1;}
{$x2=1;}
{$x03=1;}
{$x004=1;}
{$x0005=1;}
{$x00006=1;}
{$x000007=1;}
{$x0000008=1;}
{$x000000010=1;}
{$x00000000012=1;}
{$x0000000000014=1;}
{$x000000000000016=1;}
{$x0000000000000000000000000000032=1;}

Ausführungszeiten (ms)
1.7000
1.7028
1.7182
1.7228
1.7536
1.7504
1.7799
1.9604
1.9865
2.0119
2.0302
2.1288
2.4835

Was lernen wir daraus? Der vergebene Name einer Variable darf im besten Fall nicht länger als 32 (sonst Geschwindigkeitsverlust um 50%) und nach Möglichkeit kürzer als 8 Zeichen (weiterer Gewinn der 15%) sein. Also eine gesunde Mischung aus Länge und Wiedererkennbarkeit der festgelegten Variable.

D. Schleifen for, foreach, while (Performance-Gewinn 15 – 30%)
Es ist falsch, pauschal zu behaupten, while ist schneller als zum Bespiel foreach. Oder umgekehrt. Es kommt immer auf die Art des Objekts, die der Befehl zu schleifen hat.

In folgenden Beispielen wird $text – aus 100.000 ganzen Zahlen bestehend – geloopt und zum Testen temporär gespeichert. for und while sind hier gleich schnell und teilen sich entsprechend die Erstplatzierung:

Ausgeführter Code

      {$x=0; foreach($test as $n) { $x=sprintf(”test%08i”,$i);}}
{$x=0; for ($it=0; $it<100000; $it++) { $x=sprintf(”test%08i”,$i);}}
{$x=0; $it=0; while($it<100000) { $x=sprintf(”test%08i”,$i); $it++;}}
{$x=0; for ($it=0; $it<count($test); $it++) { $x=sprintf(”test%08i”,$i);}}
{$x=0; $it=0; while($it<count($test)) { $x=sprintf(”test%08i”,$i); $it++;}}
{$x=0; $co=count($test); for ($it=0; $it<$co; $it++) { $x=sprintf(”test%08i”,$i);}}
{$x=0; $co=count($test); $it=0; while($it<$co) { $x=sprintf(”test%08i”,$i); $it++;}}

Ausführungszeiten (ms)
12.0313
4.7290
4.7712
10.2847
10.3466
9.1271
9.1409

Jetzt ist $test ein assoziiertes Array. In dieser Konstellation kann sich wiederum foreach beweisen, while blamiert sich hingegen mit inakzeptablen Geschwindigkeiten.

Ausgeführter Code

      {$x=0; foreach($test as $k=>$v) {$x=sprintf(”%s=>%sn”,$k,$v);}}
{$x=0; reset($test); while (list($k, $v) = each($test)) {$x=sprintf(”%s=>%sn”,$k,$v);}}
{$x=0;$k=array_keys($test);$co=sizeof($k);for($it=0;$it<$co;$it++)
{$x=sprintf(”%s=>%sn”,$k[$it],$test[$k[$it]]);}}
{$x=0; reset($test); while ($k=key($test)) {$x=sprintf(”%s=>%sn”,$k,current($test)); next($test);}}

Ausführungszeiten (ms)
8.1222
10.3221
9.7921
8.9711

Die Tipps sind professioneller Natur und können sich erst dann richtig entfalten und unter Beweis stellen, wenn der PHP-Code aus mehr als 10 Zeilen besteht und das durchzuschleifende Array mehrere Dutzend Einträge aufweisen kann. ™

Sortiert nach:   neueste | älteste | beste Bewertung
Niels Lange
Gast

Vielen Dank für den guten Beitrag. Ich werde gleich mal die „Bremsen“ meines Webs ein wenig lockern … :-P

Nils
Gast

Muss eigentlich jede Webseite einen Mikrooptimierungs-Betrag schalten? Am Ende glauben die Leute noch, dass es bei einem großen Projekt wirklich auf so etwas ankommt.

Dark Code
Gast

Also meiner Meinung nach ist, wie mein Vorredner schon so nett sagt, die „Microoptimierung“ fürn *****.
1. Kommt es immer noch stark auf die Bandbreite und Pingzeiten vom User an.
2. Ist es z.B. viel sinvoller die Grafiken auf der HP zu optimieren, da dort mehr Zeit drauf geht!
(was ich im übrigen auch mal machen sollte ^^)
Das sollte dann deutlich mehr helfen den Aufbau usw. der Seite zu beschleunigen.

MfG _,,.->DarkCode<-.,,_

Chaos3ngel
Gast

mit deinen argumenten hast du definitiv nicht unrecht.
dennoch musst du bedenken, dass es ab einer gewissen größe eines projektes…
also wenn mehrere server zum stämmen der website arbeiten eingesetzt werden…
es durch aus nen unterschied machen kann, wieviel user pro server verarbeitet werden können
und somit ein mitunter entscheidender kostenfaktor für eine firma

Zerosan
Gast
Na ja, man sollte sich schon ab und zu mal beiträge zum Thema mikoroptimierung anschauen, da man solche in den normalen Arbeitefluss eingehen lassen kann. In diesen Beispielen z.B. zum Thema schleifen habe ich z.B. einige mehr tests durchgeführt. Und bin zu dem punkt gekommen wo ich nahezu immer nur foreach verwende, zumindest immer wenn möglich und sinnvoll. denn wenn man foreach($array AS $key => &$value) verwendet, also value als referenz verwendet, hat dies zur folge das $value auf den wert des arrays führt das durchlaufen wird, somit wird nicht mehr bei jedem durchlauf eine Kopie erstellt. Dies hat bei… Read more »
trackback

[…] man jedoch tunlichst vermeiden sollte sind Mikro-Optimierungen. In PHP gibt es hierfür einige tolle Beispiele, z.B. Strings in einfache Hochkommata schreiben, Prekrement statt Postkrement verwenden, […]

der_booker
Gast

Hat was. Netter Code. Zeigt sehr deutlich, dass es manchmal auch einfacher und dadurch schneller gehen kann.
Thanx so lot.

Esther24
Gast

Das ist doch Satire, oder? „Die Tipps sind professioneller Natur“ – selten so gelacht. Software wird für Menschen optimiert, nicht für Interpreter. Wenn die professionellen Tipps hier auf dieser Seite einen wesentlichen Performanceunterschied ausmachen, weiß man dass man eigentlich gar nichts performancekritisches macht – und sich die Zeit hätte sparen können.

trackback

[…] man jedoch tunlichst vermeiden sollte sind Mikro-Optimierungen. In PHP gibt es hierfür einige tolle Beispiele, z.B. Strings in einfache Hochkommata schreiben, Prekrement statt Postkrement verwenden, […]

Rayo
Gast

Ahoi! Bin gerade über diese Deine Seite gestolpert (auf der Suche nach einem Performance Vergleich zwischen „===“ und „==“ unter verschiedenen Bedingungen)…
Die Ergebnisse zu den Variablennamen verschiedener Länge finde ich sehr verwunderlich und halt sie für zweifelhaft! Alle Tests die wir unter verschiedenen Bedingungen auf verschiedenen Systemen durchgeführt haben, haben immer gezeigt, dass die Länge von Variablennamen KEINEN Einfluss hat auf die Laufzeit eines PHP-Programms.
Wie hast Du denn diesen Test durchgeführt?
Viele Grüße!
ar

wpDiscuz