Optimiert Programmieren in PHP

Titel: Optimiert Programmieren in PHP
Schwierigkeitsgrad: Einsteiger
Autor: neonox
Eingetragen: 21.01.2008
Hits: 31996
Kommentare: 3
User Bewertung: / 42 User haben abgestimmt

1 2 3 4 5

Social-Bookmark:

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:

Inhalt

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_unshift($mein_array'Neuer Wert');
$mein_array[] = 'Neuer Wert'// Schnellste Variante

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
for ($i=0$i<count($mein_array); ++$i) {

}
// Richtig
$maximale_durchlaeufe count($mein_array);
for (
$i=0$i<$maximale_durchlaeufe; ++$i) {

}

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
$mein_array = array('ebene_1'=>array('ebene_2'=>array('ebene_3'=>array('ebene_4'=>array('A''B''C''D')))));
foreach (
$mein_array['ebene_1']['ebene_2']['ebene_3']['ebene_4'] as $key => $value) {
// Code
}

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
$mein_array = array('ebene_1'=>array('ebene_2'=>array('ebene_3'=>array('ebene_4'=>array('A''B''C''D')))));
$meine_referenz =& $mein_array['ebene_1']['ebene_2']['ebene_3']['ebene_4'];
foreach (
$meine_referenz as $key => $value) {
// Code
}

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:

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';
echo 
"dieser Text. Aber dieser hier ist nur minimal schneller.";
echo 
"Dieser hier ist $langsamer als";
echo 
"dieser Text, wo die ".$variable." verkettet wird.";

Der Unterschied beträgt aber lediglich zwischen 5-12%.

Mythen der Optimierung

Kommentare

*sorry*

ihr habt ja recht *schäm*

frage steht im forum, könnt also sehr gerne die einträge löschen. trotzdem danke für diesen artikel!

vg xac

#3 - Dienstag der 20 Mai, 2008 20:03 Uhr - xac (Gast)

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 - admin

array 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

#1 - Dienstag der 20 Mai, 2008 15:42 Uhr - xac (Gast)
1

Kommentar hinzufügen

Benutzername*
E-Mail
Titel*
Dein Kommentar*
Captcha*