Fr os con2010_devel_nytprof

download Fr os con2010_devel_nytprof

If you can't read please download the document

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!