Mittlerweile wissen wir alle, dass es einige Ansätze gibt, mit denen wir unsere PHP Anwendung schneller machen können. Wir verwenden Compiler-Beschleuniger, Code-Aufräumer sowie verschiedene Caching Verfahren, und steigern so die Leistung der Anwendung. Vor deren Einsatz lohnt es sich immer, erst einen Blick auf den eigenen Code zu werfen. Denn oft sind eine nicht gut formulierte Datenbankabfrage oder die Geschäftslogik der Grund für eine langsame Anwendung. Dabei spielen auch oft die gesetzten Indices auf der Datenbanktabelle eine Rolle. Hier sollte man bei der Datenbankabfrage genau prüfen, ob sie auf die Indices zugreift und sie eventuell entsprechend anpassen. Oft ist es performanter, die Daten einfach nur aus der Datenbank zu holen und sie erst in der Geschäftslogik zu sortieren oder zu filtern. Das muss man einfach ausprobieren, denn das ist von Fall zu Fall unterschiedlich. Zusätzlich sollte man auch einen Blick auf die geschriebenen Algorithmen und Funktionen werfen, denn es gibt immer welche, die noch schneller sind.
Im Allgemeinen gilt:
- Immer die PHP-nativen Funktionen statt den eigenen Nachbau verwenden.
- Je weniger Code eine Funktion benötigt, desto höher ist die Wahrscheinlichkeit, dass der Code schneller läuft.
- Eine saubere Programmierung ist auch oft eine sicherere.
- Man sollte seine Scripte nach Möglichkeit optimieren, dabei aber nicht übertreiben.
An diesem Punkt würde ich jedoch gerne speziell auf die Guckloch-Optimierung eingehen. Ein Grund dafür ist die lustige Bezeichnung. Der andere Grund ist, dass wir hier etwas über PHP-Core erfahren, sowie darüber, wie wir die Effizienz des Codes verbessern und wie wir den Compiler mit unserer Geschäftslogik entlasten können.
Zum Beispiel, indem wir den $counter++ in ++$counter umwandeln, wenn der Rückgabewert in einem leeren Kontext verwendet wird. Also, der $counter++ inkrementiert, nachdem jeder Ausdruck, der $counter enthält, ausgewertet wurde, zum Beispiel wird bei $i = $counter++; vor der Implementierung $i der Wert von $counter zugewiesen. Intern bedeutet dies, dass die Engine den Wert von $counter speichern muss, um ihn in jedem Ausdruck verwenden zu können. Im Gegensatz dazu wird ++$counter vor irgendwelchen anderen Berechnungen inkrementiert, daher muss kein temporärer Wert gespeichert werden. So sparen wir an Speicher und Rechenleistung. Wenn $counter++ in einem Ausdruck verwendet wird, in dem sein Wert nicht gebraucht wird, kann es sicher in ++$counter umgewandelt werden. Denn optimierte Compiler können viele andere Operationen durchführen, und es macht immer wieder Spaß, noch etwas mehr an Leistung aus dem eigenen Code rauszuholen.
Das war nur ein Beispiel, um uns genau vorstellen zu können, was mit einer Guckloch Optimierung gemeint ist. Hier eine Liste von weiteren Guckloch Optimierungen:
- Unerreichbaren Code löschen
- Überflüssiges Laden und Speichern löschen
- Kontrollfluss-Optimierung
- Algebraische Vereinfachungen
- Reduktion von Operationskosten
- Ausnutzung von Eigenschaften der Maschine
Auf der Seite: http://www.neuschwimmer.de sind die weiteren Guckloch-Optimierungsansätze genau geschildert. Sie beinhalten allgemeingültige und verständliche Beispiele, die sich auch leicht in einer PHP Anwendung einsetzen lassen.
Weiterführende Informationen:
PHP Optimieren
Premature Optimization
Optimiert Programmieren in PHP
PHP-Benchmarks
Der eAccelerator
Caching für PHP Systeme