Code-Optimierung
Aus php bar
Hinweis
Die meisten hier vorgestellten Optimierungen liegen nicht unbedingt im wahrnehmbaren Bereich, und verlieren teilweise vollkommen ihre Wirkung beim Einsatz von Bytecode-Caches (z. B. APC, eAccelerator) Zum erfolgreichen Optimieren sollte mit Hilfe eines Profilers analysiert werden welche Code-Teile die meiste Zeit beanspruchen und die Optimierung darauf konzentriert werden. Häufigste Kandidaten sind SQL-Queries und andere Netzwerk-Funktionen.
Das Wahrscheinlichste zuerst
Wenn eine Überprüfung stattfindet, bei der man weiß, dass ein bestimmtes Ereignis wahrscheinlicher auftritt als das andere, dann prüft man immer erst auf das wahrscheinlichere:
1 $array = array('ja', 'ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'ja', 'nein', 'nein'); 2 function istJa($arr) 3 { 4 foreach ($arr as $a) { 5 if ($a == 'ja') { 6 return true; 7 } 8 return false; 9 } 10 }
ist schneller als
1 $array = array('ja', 'ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'ja', 'nein', 'nein'); 2 function istJa($arr) 3 { 4 foreach ($arr as $a) { 5 if ($a != 'ja') { 6 return false; 7 } 8 return true; 9 } 10 }
Das Schnellere zuerst
1 if (schnelleFunktion() || langsameFunktion()) { 2 // ... 3 }
ist schneller als
1 if (langsameFunktion() || schnelleFunktion()) { 2 // ... 3 }
Weil aufgrund der ODER-Verknüpfung nur eine Bedingung erfüllt sein muss, ist es nicht notwendig die zweite langsame Funktion noch auszuführen wenn die erste schnelle Funktion bereits wahr/true zurück geliefert hat. Selbiges gilt natürlich auch für UND-Verknüpfungen, wenn die erste (schnelle) Funktion bereits falsch/unwahr zurückliefert braucht die zweite (langsame) Funktion nicht mehr ausgeführt werden.
In-/Decrementieren von Variablen, $i++ vs ++$i
Status: nicht überprüft
++$i bzw. --$i ist Schneller als $i++ bzw $i--, da nur 3 statt 4 Opcodes benötigt werden.
perl vs. posix Reguläre Ausdrucke
perl ist schneller ;-)
preg*() ist laut PHP-Handbuch immer die schnellere Alternative zu ereg*(). Außerdem sollen die ereg*()-Funktionen in PHP 6 nicht mehr vorhanden sein.
Quellen
true, false, null vs. TRUE, FALSE, NULL
true, false, null ist schneller, da PHP diese Konstanten auch klein geschrieben verwaltet und somit true nach einem Suchlauf findet, TRUE hingegen erst beim zweiten.
mysql_fetch_*
- mysql_fetch_row ist am schnellsten/braucht am wenigsten Speicher, da es ein durchnummeriertes Array (Reihenfolge richtet sich nach dem Abfrage-Befehl) zurückgibt
- mysql_fetch_assoc gibt ein assoziatives Array zurück
- mysql_fetch_array gibt die Kombination aus row und assoc zurück (entspricht array_merge(mysql_fetch_row(...), mysql_fetch_assoc(...)))
echo, print
echo ist schneller als print. Bei echo ist es schneller verschiedene Strings nicht per "." zu verbinden sondern diese mittels "," als Attribute an echo zu übergeben.
1 echo 'string1','string2';
ist schneller als
1 echo 'string1'.'string2';
ist schneller als
1 print 'string1'.'string2';
'(einfaches Anführungszeigen) und "(doppeltes Anführungszeichen)
' ist schneller, da hier nach keinen zu verarbeiteten Variablen gesucht werden muss.
Funktionsaufrufe in Schleifenbedingungen
In Schleifenbedingungen sollte man niemals Funktionen aufrufen, ein einfaches Prinzip, was jedoch von vielen (unbewusst) ignoriert wird.
Beispiel:
1 $array = array ('elem', 'elem2', 'test', 'laber', 'moo', 'flx', 'meh'); 2 3 // Schlecht 4 for ($i=0; $i < count($array); $i++) 5 echo $array[$i]; 6 7 // Gut 8 $num = count ($array); 9 for ($i=0; $i < $num; $i++) 10 echo $array[$i];
Das Problem ist das count($array) im Schleifenkopf, da dieses bei jedem Durchlauf neu aufgerufen wird.
Quellen
- http://ilia.ws/archives/12-PHP-Optimization-Tricks.html
- http://www.faqts.com/knowledge_base/index.phtml/fid/38
Vergleichsoperatoren
Beim normalen Vergleichsoperator wird PHP solange typcasting machen, bis alle Typen überprüft sind, oder die Aussage zutrifft. Beim Typ-Vergleichsoperator steht der Typ schon fest, daher wird nur der Wert überprüft.
Beispiel:
1 if ($var===true) { // am schnellsten, da der typ schon feststeht 2 if ($var==true) { 3 if ($var) { // wie == 4 // und hier nochmal mit Negation 5 if ($var!==true) { // schnell 6 if ($var!=true) { // langsam 7

