Managing Tech

Managing Technology, from the trenches

Infos

Im privaten Blog von Jan Miczaika geht es um die Arbeit mit Technologien, in Teams, und das insbesondere im Startup-Umfeld. Kontakt?
    jan -at- hitflip.de oder bei XING

Mein Kollege Jupp hat bei uns in der Firma kurz vor Weihnachten XHProf installiert. Wer das nicht kennt: XHProf ist ein kostenloses Code-Profiling-Tool von Facebook. PHP hatte m.E. lange keinen ordentlichen Profiler, XHProf könnte was werden.

Die Ergebnisse der Aufrufe waren so beeindruckend (und erschreckend), dass Jupp direkt eine Woche Zeit bekommen hat, um unseren Code zu durchforsten. Das Ergebnis

  • Die Execution Time wurde teilweise um bis zu 75% reduziert.
  • Unser Code wirkt jetzt teilweise etwas komisch.

Normalerweise würde man ja sagen: wenn solche Ersparnisse drin sind, wurde vorher etwas falsch gemacht. Zumindest würde ich das immer behaupten. Unsere Ladezeiten waren aber immer ok (zwischen 600-800 ms) und deswegen war Performance lange keine Baustelle. Der Cache federt bei uns Unfug ab, und ordentliche Hardware macht den Rest.

Wo kam der Performance-Gewinn her? Zwei Stellen waren:

Magic Functions und Member Variablen. Wir machen ausgiebigen Gebrauch von magic functions. Vor allem, um partitionierte Daten nachzuladen. Oft ist es aber wesentlich günstiger mit den Daten, die man eh hat, die member Variablen zu füllen anstatt auf den __get() zu warten. Auch wenn __get() im Normalfall sehr billig ist (je nachdem, was man da alles reinsteckt).

Validate Methoden. Jeder Service in unserer Architektur validiert alle Parameter, mit denen er aufgerufen wird. So kommt kein Quatsch bis zur DB vor. Dabei gibt es einfache Validierungen (int, string) aber auch kompliziertere, bis hin zu DB-Lookups usw. Wir finden Sicherheit wichtig, und dazu gehören saubere Input-Daten. Diese validate-Funktionen werden hunderte Male pro Seite aufgerufen. Zum einen haben wir da die “Klassen-lastigkeit” reduziert. Wir haben Zend_Validate eingesetzt, da liegen zwischen dem Aufruf und dem Ergebnis verschiedene Klassen, diese implements dies, die andere macht die factory für das usw. Zusätzlich machen an so zentralen Stellen Code-Änderungen im PHP-Bereich Sinn. Normalerweise wird da ja viel kaputt optimiert, aber bei den zentralen Stellen bekommt man was raus. Ein unintuitives Lieblingsbeispiel von mir:

if (isset($aValues[$sNeedle]))
{
   return true;
}
elseif (in_array($sNeedle, $aValues))
{
   return true;
}
else
{
   return false;
}

Normalerweise könnte man sagen, das obere mit dem isset() kann man sich sparen. Richtig. Nur: isset ist viel schneller als in_array (Benachmarks, mehr). In diesem Fall hat der isset ca. 95% der Fälle erledigt, NULL kommt selten vor. Sprich der aufwendigere Code ist sogar schneller. Pro Ausführung spart man jetzt nicht wahnsinnig viel, aber in einer sehr zentral genutzten Funktion macht es schon einen Unterschied.

Ich kann XHProf wärmstens empfehlen. Man entdeckt tolle Sachen (wer zum Teufel hat die Regex da eingebaut?) und spart Ausführungszeit. Uns hat die Optimierung sicherlich ein Hardware-Upgrade eingespart.

Ein kleiner Hinweis noch: wenn man XHProf lokal auf dem Testsystem ausführen muss man unbedingt gucken, dass die Bedingungen, insbesondere was Caches angeht, den realen entsprechen. Sonst wird an der falschen Stelle optimiert. Passiert den besten Bloggern…

One Response to “Tipp des Tages: Beispiele für Profiling mit XHProf”

  1. […] habe ich wieder einen sehr interessanten Artikel von Jan gelesen. Dieses mal geht es um PHP Profiling. Er berichtet über den Einsatz von XHProf von […]

    Zeit ist Geld oder PHP Profiling mit XHProf | Gerds Blog

Leave a Reply