Abro, Februar 2009

PHP Tips: Speedup PHP!

phpIch kam unlängst nicht umher einmal wieder meine Bookmarks aufzuräumen. Bei dieser Gelegenheit fiel mir einmal mehr phpbench.com ins Auge. Die angeblich tollste Publikation eines PHP-Benchmarks. Ganz nett wie so vieles – wenn man mit Verstand und zwischen den Zeilen liest. Da der Ottonormalcoder dazu aber nicht die Zeit hat, kann ich das hier einfach nicht guten Gewissens ohne den SEO-ethischen Zusatz “nofollow” verlinken. Warum ? Weil ich den zugrunde liegenden Source gelesen habe und mir zwar sicherlich irgendwo nur rudimentär, hierfür aber feingranular genug, bekannt ist was PHP tut. Die Ergebnisse des Speedtests sind dort nicht astrein, somit nur bedingt aussagekräftig.

Hier mag ich dazu die 1001te Liste zufällig ausgewählter, möglicher PHP-Speedups niederschreiben,
nach meinem höchsteigenen PHP 5.2 Erkenntnisstand:

  • Erst denken, dann schreiben. KISS siegt zuletzt immer.
  • MySQL lernen, meist kann man alle Informationen einer Seite mit nur einem Query abrufen.
  • Abstractionlayer (oder auf deutsch “weitere Abstraktionsebenen”) vermeiden, wenn sie keinen echten Vorteil bieten. Frei nach Rasmus Lehrdorf: PHP selbst ist eine Template-Engine, da ist es Hohn ein turingvollständiges Smarty zu schreiben.
  • Zend (o.ä.) Optimizer einschalten. Dieser erkennt oftmals wenn wir Quatsch im PHP schreiben.
  • Aus Schleifen heraushalten, was nicht darin stehen muss.
    • for($i=0,$i_max=count($array); $i<$i_max; ++$i) statt for($i=0; $i<count($array); ++$i)
  • Validen PHP-Code schreiben.
    • Fehlermeldungen werden unnütz generiert und u.u. in Logfiles geschrieben.
    • Falsche Keybenutzung z.B. zwingt PHP zum selbsttätigen geradebiegen. Nutzt also $array[‘key’] statt $array[key].
    • Das arbeiten mit undefinierten Variablen strengt PHP an. Also erst Variable anlegen, dann inkrementieren/verketten/what you like.
    • @ zum unterdrücken von Fehlern ist langsam, wenn nötig ist ini_set(‘error_reporting’,’0′) für die Produktivumgebung die schnellere Alternative.
  • Konstanten bzw. Variablen statt Funktionen nutzen.
    • PHP_VERSION statt phpversion().
    • $_SERVER[‘REQUEST_TIME’] eher als time().
  • PHP-Sprachkonstrukte statt Funktionen nutzen.
    Z.B. Längenprüfungen von Strings und Arrays per isset(). strlen() zeigt zwar im C-Code mit dem zval-struct seine ganze Schlauigkeit, ist aber immernoch eine Funktion.

    • isset($var{$len-1}) statt strlen($var)>=$len
    • isset($var[$len-1]) statt count($var)>=$len
  • include() statt include_once(), ist ja logisch.
  • strpos(…) !== false zum Testen ob ein String in einem anderen existiert.
  • strpos() vor umfangreicheren Ersetzungen, um zu prüfen ob sie überhaupt nötig sind.
  • Statische Methoden statt normalen Methoden deklaratieren.
  • HereDoc / NowDoc vermeiden.
  • Inkrementieren mit ++$i statt $i++.
  • Vergleiche strikt durchführen
    mit === statt ==, das gillt auch für Funktionen mit der strict-Option.
  • Die Länge der Variablennamen, vorallem aber die Tiefe der Arrays (in der X-Achse) einigermaßen klein halten.
  • Referenzen nutzen. $var_copy = &$var statt $var_copy = $var wenn zu erwarten ist, dass $var groß ist.
  • unset($var) macht Sinn, wenn $var groß ist. Damit unser Speed nicht doch irgendwann absackt.
  • file_get_contents() ist die tollste Funktion um Dateien normaler Größe auszulesen.
  • preg* ist cool, ereg* nicht.
  • while() ist meist die schnellste Schleifenart.

Man kann immer einiges besser machen, so man denn mag. Man sollte es nur nicht übertreiben. Überoptimierter Code wird nicht unbedingt schnell, dafür aber schnell unleserlich. Wenn man will, kann man das Optimieren ja bis zur lächerlichkeit Hochtreiben, indem man z.B. C schreibt…

Meist ist PHP tatsächlich selbst so schnell, dass es dem Endbenutzer gar nicht auffällt wenn der Code in einer stupend-horrenden Weise schlecht ist. Ich bin also (mittlerweile) der festen Überzeugung, dass die simplizität des Codes aufgrund der Schreibgeschwindigkeit und der Wartbarkeit einen unbedingten Vorrang vor allen 1000 Mini-Optimierungen hat, die es da gibt. Also vor einer Optimierung der einzelnen Befehle immer zuerst darüber nachdenken, ob man nicht die Arbeitsweise seines Programms umstricken kann. Weniger Datenbankabfragen, sowie die Verwendung von PHP-Funktionen statt eigener, sind unsere Haupthebel.

Wenn man selbst einmal nachbohren möchte, wo genau die Bottlenecks im eigenen Source liegen, schaltet man einfach den Profiler in seiner Lieblings-IDE ein und reibt sich über die Ergebnisse verwundert die Augen. Besonders spannend wird das, wenn man einmal so tut als könnte die Anwendung erfolgreich werden. Einfach mal den Datenstamm und die Anfragen hochdrehen. Zügige Abarbeitung sollte ja speziell in solchen Fällen Priorität haben. 10 Webseitenbesucher am Tag wird es dagegen kaum bevorteilen, wenn ihre Seite 5ms schneller geparst wird.

Fröhliches PHP optimieren – the performance is yours!


Kommentare sind geschlossen.
Aufgrund interner Umstrukturierungsmaßnahmen ist es uns z.Zt. leider nicht
möglich auf neue Kommentare zu reagieren. Wir bitten dies zu entschuldigen.
Bei dringenden Rückfragen suchen Sie bitten den direkten Kontakt zu uns.
Das Unternehmen Lucido Media GbR wurde am 31.12.2013 stillgelegt. Diese Website existiert weiterhin zu Archivzwecken. Der Gesellschafter Daniel Abromeit führt seine Arbeit ab sofort unter dem Dach der Agentur Koch Essen fort. Für entsprechende Anfragen wenden Sie sich daher bitte an http://koch-essen.de/kontakt/