Fr os con2010_devel_nytprof
-
Upload
renee-baecker -
Category
Technology
-
view
1.594 -
download
0
Transcript of Fr os con2010_devel_nytprof
Dem Performance-Killer auf der Spur
Performance-Killer
Die Jger
Devel::DProf
Devel::SmallProf
Devel::NYTProf
Spezielle Profiler
Profiling fr den Perl-Programmierer
Arten des Profilens...
CPU TimeReal Time
Subroutine??
Statement??
CPU Time
Nur die Zeit, die die CPU beschftigt ist
Exklusive I/O, Datenbanken, etc.
Kaum beeinflusst von der Auslastung des Rechners
Real Time
Komplette Dauer der Ausfhrung
Inklusive I/O, Datenbanken, etc.
Stark beeinflusst durch Auslastung
Subroutine
Misst die Zeit zwischen Betreten und Verlassen der Subroutine
Inklusive aller Subroutinen und Code, die innerhalb der Subroutine aufgerufen werden
Ziemlich schnell, da nur an wenigen Punkten die Zeit genommen werden muss wenig I/O
Subroutine
Kann durch goto &sub und andere Sprnge durcheinander gebracht werden.
Liefert keine Anhaltspunkte, wo genau in der Subroutine die Zeit verloren geht
Kann keinen Code auerhalb von Subroutinen messen
Statement
Misst den Zeitverbrauch pro Statement/Zeile (vom Start der Ausfhrung des einen Statements bis zum Start des nchsten Statements)
Exklusive Zeit fr aufgerufene Subroutinen (Ausnahme: Built-ins und xsub)
Sehr hohe Genauigkeit
Statement
Sehr viel I/O
Manchmal etwas ungenau
Zu detailliert fr groe Subroutinen
Schwierig, eine Zeit fr die Subroutine zu bekommen
Hufiges Problem: bei Aufruf einer Subroutine und dann etwas anderes ausfhren, wird alles der Subroutine zugerechnet
Funktion() + mkdir('./verzeichnis');
Anwendungsbereiche profilen
Evtl. liegen die Probleme auerhalb des Perl-BereichsDatenbanken
File I/O
Manche Jger bleiben auf der Strecke
Devel::DProf steht kurz vor der PensionierungAb Perl 5.16 wird es voraussichtlich nicht mehr im Core sein
Maintenance-Nightmare
Liefert hufig falsche Ergebnisse (je schneller die CPUs werden, desto schlechter werden die Ergebnisse)
Devel::SmallProf ist veraltet
Devel::NYTProf
to the rescue
leider erst ab Perl 5.8.1
Devel::NYTProf
Fork von Devel::FastProf
Gestartet von Adam Kaplan von New York Times
Ein paar Bugfixes fr Devel::FastProf plus HTML-Auswertung an Devel::Cover angelehnt
Hhere Genauigkeit (beachtet Overhead des Profilers beim Schreiben der Daten)
Tests wesentlich verbessert
Devel::NYTProf
Ist ein Statement und und Subroutinen Profiler
Wertet Subroutinen pro Aufruf aus
Auch fr xsubs
Berechnet Exklusiv-Zeiten on-the-fly
Kann mit Dingen wie goto &sub umgehen
Schreibt Datei erst am Ende
Sehr schnell
Devel::NYTProf
Der Statement-Profiler wurde verbessertDas Statement am Ende einer Schleife bekommt nicht die Zeit fr die Auswertung der Bedinung hinzugerechnet
Das Statement am Ende einer Subroutine bekommt nicht den Sub-Overhead hinzugerechnet
Devel::NYTProf
Kann auch Systemaufrufe und Regexps profilen
Ergebnis kann in verschiedene Formate transformiert werden
Ergebnisse verschiedener Lufe knnen vereint werden
Link zu allenSubroutinen
Zusammen-fassung
Link zu Codemit Anmerkungen
Zeiten frBuilt-ins
Exklusive Zeit vs. Inklusive Zeit
Exklusive Zeit ist gut fr Bottom-UpDetails, wo die Zeit verbraten wird
Ntzlich fr lokale Optimierungen
Inklusive Zeit ist gut fr Top-Downberblick, wo die Zeit verbraten wird
Ntzlich, um strukturelle nderungen zu priorisieren
Gesamte Zeit fr diese Subroutine und alle darunter
diese + alle darunter
Von wo wurde diese Subaufgerufen, und welche ruftsie selbst auf
Farbschema basiertauf mittleren Werten
Kurze Demo...
Tipps & Tricks
Vermeide die 2!
Phasen der
Optimierung
Phase 0
Don'tdo it!
Optimierung
birgt hufig
Fehler!
Phase 1
Leichte zu erreichende Optimierung
Code profilen bei einer durchschn. Auslastung
Blick auf die Exklusive Zeit von Subs
Sie erscheinen nicht plausibel?
Die rgsten Fehler ausfindig machen
Nur einfache(!) lokale Probleme beheben
Erneut profilen
Schnell genug? STOPPEN
Evtl. wiederholen
Einfache lokale Probleme
Temporre Variablen nutzen
$self->eine->weitere->Methode->die->ein->Objekt->liefert->Hallo();$self->eine->weitere->Methode->die->ein->Objekt->liefert->Welt();
In:
my $object = $self->eine->weitere->Methode->die->ein->Objekt->liefert;$object->Hallo();$object->Welt();
Einfache lokale Probleme
Schnellere AccessorenClass::Accessor::Fast::XS
Einfache lokale Probleme
Aufrufe von Subroutinen vermeiden, die nichts machen (z.B. Logging)
my $is_logging = $logger->info( 'bla' );
while ( ) { $logger->info( 'foo' ) if $is_logging;}
Einfache lokale Probleme
Subroutinen und schleifen so frh wie mglich verlassen
sub testsub { my ($self,$data) = @_;
return if !$data; return if ref $data ne 'ARRAY';
for my $entry ( @{$data} ) { }}
Erneut testen...
Schnell genug?
STOPP!
Phase 2
Tiefergehende nderungen
Bei einer bekannten Auslastung testenBei Webapplikationen z.B. 1000 gleichzeitige Requests starten
Inklusive Zeit der Subroutinen testenIst der Anteil bei der Auslastung plausibel?
Prfen, wie hufig die Subroutinen aufgerufen wurdenIst die Zahl bei der Auslastung plausibel?
Evtl. Caching einbauen Ist aber fehleranfllig
Tiefergehende nderungen
Werden viele Objekte erzeugt, die gar nicht bentigt werden?Proxies/Lazy Loader einsetzen soweit vorhanden
Erneut testen...
Schnell genug?
STOPP!
Phase 3
Strukturelle nderungen
Schleifen nach unten verschieben
$self->walk( $_ ) for @dogs;
In
$self->walk_dogs( \@dogs );
Strukturelle nderungen
ndern der DatenstrukturenHashes vs. Arrays
Algorithmus ndernz.B. verschiedene Sortieralgorithmen
Besonders kritische Dinge in C programmierenInline::C
Viele kleine
nderungen
haben eine
groe Wirkung
Fragen?
Danke!