Code-Optimierung

Aus php bar
Wechseln zu: Navigation, Suche

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:

 $array = array('ja', 'ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'ja', 'nein', 'nein');
 function istJa($arr)
 {
     foreach ($arr as $a) {
         if ($a == 'ja') {
             return true;
         }
         return false;
     }
10 }

ist schneller als

 $array = array('ja', 'ja', 'ja', 'ja', 'ja', 'ja', 'nein', 'ja', 'nein', 'nein');
 function istJa($arr)
 {
     foreach ($arr as $a) {
         if ($a != 'ja') {
             return false;
         }
         return true;
     }
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:

 $array = array ('elem', 'elem2', 'test', 'laber', 'moo', 'flx', 'meh');
 
 // Schlecht
 for ($i=0; $i < count($array); $i++)
   echo $array[$i];
 
 // Gut
 $num = count ($array);
 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

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 


Quellen