Optimiert Programmieren in PHP

Schwierigkeitsgrad: Einsteiger
Autor: neonox
Eingetragen: 21.01.2008
Hits: 36488
Kommentare: 3
User Bewertung:




Mit diesem Artikel will ich zeigen, welche Algorithmen und Funktionen oft schneller sind als andere - auch abhängig von der Verwendung. Denn nicht immer ist Methode A schneller als Methode B. Es kommt darauf an, in welchem Zusammenhang sie verwendet wird. Außerdem will ich aufzeigen, welche typischen und häufig gemachten Algorithmen richtige Ressourcenfresser sind.
Optimiertes programmieren hat viele Vorteile:
- man spart Rechenzeit
- die Seite wird schneller an den Besucher ausgeliefert
- man spart Bandbreite
- eine saubere Programmierung ist auch oft eine sicherere
Inhalt
- Arrays - Werte hinzufügen
- Schleifen
- Dateien auslesen
- mysql_fetch_array() vs. mysql_fetch_assoc()
- Referenzen bei Mehrdimensionalen Arrays
- Konstanten nicht missbrauchen
- " und ' - was ist schneller
- Mythen der Optimierung
Funktionen für den richtigen Moment
Arrays - Werte hinzufügen
Es gibt viele Möglichkeiten einen Wert einem Array hinzuzufügen.
1 2 3 |
array_push($mein_array, 'Neuer Wert'); |
array_push() und array_unshift() sind sich ähnlich, jedoch nicht identisch. array_unshift() fügt das neue Element an den Anfang des Arrays, array_push() macht das Gegenteil. Wenn es jedoch unwichtig ist, wo die Elemente beim Array hinzugefügt werden sollen, so empfiehlt sich die kurze Zeiweisung mittels $mein_array[] = 'Neuer Wert.' denn dies ist die schnellste der drei Varianten.
Schleifen
for, foreach und while. Diese drei Schleifentypen existieren in PHP, doch sollte man nicht annehmen, dass alle drei gleichschnell sind. Bei der for-Schleife ist vorallem wichtig, die Anzahl der Durchläufe im Voraus zu berechnen.
1 2 3 4 5 6 7 8 9 |
// Falsch |
Die for-Schleife ist bei großen Arrays mit ein paar tausend Einträgen die schnellste Schleife unter Verwendung von Pre-Inkrement (++$i) und nicht Post-Inkrement ($i++).
Bei kleineren Arrays empfiehlt sich die foreach-Schleife. Sie ist sogar schneller als eine for-Schleife unter Verwendung von Pre-Inkrement.
Dateien auslesen
Zum Auslesen von Dateien gibt es ebenfalls in PHP mehrere Möglichkeiten. Vorweg möchte ich sagen, dass fopen() + fgets() die langsamste Methode ist, eine Datei auszulesen, egal wie groß oder klein sie ist. Bei kleineren (unter 10 kB) Dateien empfiehlt sich die Verwendung von file() + implode(). Bei großen Dateien empfiehlt sich die Verwendung von file_get_contents().
mysql_fetch_array() vs. mysql_fetch_assoc()
mysql_fetch_array() vs. mysql_fetch_assoc(). Die schnellere Funktion ist natürlich mysql_fetch_assoc,() weil bei dieser ein Array geliefert wird dessen Index aus den Spaltennamen der MySQL-Tabelle besteht, während bei mysql_fetch_array() zusätzlich ein numerischer Index geliefert wird, welcher meistens nicht gebraucht wird, daher ist mysql_fetch_assoc() die schnellere Variante.
Referenzen bei mehrdimensionalen Arrays
Referenzen bei mehrdimensionalen Arrays bringen echten Performanceschub. Beispiel gefällig?
1 2 3 4 5 6 |
// Langsam |
Um das ganze nun deutlisch schneller zu machen, legt man eine Referenz an, die auf die gewünschte Ebene zeigt:
1 2 3 4 5 6 7 |
// Schnell |
Konstanten nicht missbrauchen
Vorallem viele Anfänger machen oft den Fehler und verwenden ohne es zu wissen, eine Konstante falsch. Bestes Beispiel hierfür ist $array[mein_index]. Ohne die " ist mein_index für PHP eine Konstante. Die Ursachen sind folgende:
- 1 strtolower
- 2 hash lookups
- E_NOTICE Nachricht wird erzeugt
- temporärer String wird erzeugt
Daher sollte man es richtig schreiben $array['mein_index']. Der Geschwindigkeitsunterschied hier liegt bei unglaublichen 700% (!!!).
' und " - was ist schneller
Manche sagen ' ist schneller als ", weil der Parser bei ' nicht darauf achten muss, ob eine Variable im String vorhanden ist. Andere sagen wiederum, es gibt keinen Unterschied. Tatsache ist, es gibt einen kleinen Unterschied und " ist schneller als '. ABER wichtig ist auch, eine Variable innerhalb von " ist langsamer, als wenn diese Variable verkettet wird. Beispiel:
1 2 3 4 |
echo 'Etwas langsamer als'; |
Der Unterschied beträgt aber lediglich zwischen 5-12%.
Mythen der Optimierung
- PHP-Code ohne Kommentare ist schneller als mit Kommentare - FALSCH
- Mit Objekten arbeiten macht den Code schneller - FALSCH
- ? : ist schneller als if() {} else {} - FALSCH
- ' ist schneller als " - FALSCH
Kommentare
Ab ins Forum ;-)
hi xac, deine Frage ist ein wenig umfassend, poste sie doch lieber ins Forum.
#2 - Dienstag der 20 Mai, 2008 15:52 Uhr - adminarray vs mysql
hi neonox, vielen dank für den spannenden beitrag. ich hätte eine frage, die ich bisher in dieser form noch nicht behandelt gesehen / gefunden habe. vielleicht hast du hier eine lösung oder tipp?!
beispiel:
1 shop hat 15 hauptwarengruppen und insgesamt 450 warengruppen, die sich in bis zu 4 ebenen unter den hauptwarengruppen strukturieren (beispiel: computer / speicher / usb / usb sticks)
die artikel sind immer der letzten warengruppe (hier also "usb sticks" zugeordnet und können zudem in mehreren warengruppen platziert sein (also z.b. auch unter "kleinartikel".
nun soll in der detailansicht der komplette pfad zu den warengruppen angezeigt werden und jede erscheinende warengruppe mit dem individuellen pfad. der link besteht nur aus "warengruppenname" + "id". i.d.r. werden so in der detailansicht ca. 4 bis 16 urls gebildet.
jetzt stehe ich vor der frage, am anfang ein array mit ca. 450 einträgen per include zu laden $arr = array(ID=>"wg name", ...) und die namen per $nm = $arr[ID] auszulesen oder jedesmal eine query auszulösen.
ich denke, dass die mysql query schneller wäre, wie ist es i.d.fall mit der belastung des servers, wenn mehrere besucher gleichzeitig den shop besuchen? ist ein array dann nicht besser???
sonnige grüße
xac
*sorry*
ihr habt ja recht *schäm*
#3 - Dienstag der 20 Mai, 2008 20:03 Uhr - xac (Gast)frage steht im forum, könnt also sehr gerne die einträge löschen. trotzdem danke für diesen artikel!
vg xac