Devel::NYTProf - Der beste Profiler für Perl

Veröffentlicht von Thomas Fahle am (Permalink)

Devel::NYTProf ist ein recht neuer, aber sehr leistungsfähiger Profiler für Perl, der von Adam Kaplan für die New York Times (daher der Name) entwickelt wurde. Tim Bunce, bekannt als Enwickler der Datenbankschnittstelle DBI, entwickelt Devel::NYTProf weiter.

Zeilen und Unterprogramme

Zeilenorientierte Profiler wie Devel::SmallProf bzw. Devel::FastProf von Salvador Fandiño García zeigen, welche Zeile eines Perl-Programms wie oft aufgerufen wurde und wieviel Zeit dafür benötigt wurde.

Unterprogrammorientierte Profiler wie Devel::DProf von Ilya Zakharevich zeigen, welches Unterprogramm eines Perl-Programms wie oft aufgerufen wurde und wieviel Zeit dafür benötigt wurde.

Devel::NYTProf kann sowohl zeilen- als auch unterprogrammorientiert messen und läuft auf Linux/Unix und Windows.

Schauen wir uns den neuen Profiler mal etwas näher an.

Beispielprogramm: Fakulät berechnen

Das Beispielprogramm berechnet die Fakulät einer Ganzzahl auf drei unterschiedliche Arten: rekursiv und zweimal iterativ. Die Variationen habe ich dem Journal of ambs: How would you write factorial? entnommen.

#!/usr/bin/perl 
use strict;
use warnings;

# Berechnung der Fakultaet n! 

my $n = 70;

print recursive($n)  , "\n";
print iterativ($n)   , "\n";
print iterativ2($n)  , "\n";


sub recursive {
  my $n = shift;
  if ($n == 1 or $n == 0) {
     return 1;
  }
  my $total = $n * recursive($n-1);
  return $total;
}
sub iterativ {
    my $v = shift;
    my $res = 1;
    while ($v > 1) {
        $res *= $v;
        $v--;
    }
    return $res;
}
sub iterativ2 {
    my $v = shift;
    my $res = 1;
    grep {$res*=$_} (1..$v);
    return $res;
}
# Quelle:
# Journal of ambs: How would you write factorial?
# http://use.perl.org/~ambs/journal/37511

Das Programm erzeugt folgende Ausgabe:

$ perl factorial.pl
1.19785716699699e+100
1.19785716699699e+100
1.19785716699699e+100

Das ist übrigens das selbe Beispielprogramm wie in den Beiträgen In welcher Zeile verbrät mein Programm die meiste Zeit? Devel::SmallProf und Devel::FastProf geben Antworten bzw. In welchem Unterprogramm verbrät mein Programm die meiste Zeit? Devel::DProf liefert Hinweise.

Devel::NYTProf

Das Beispielprogramm lässt sich mit Devel::NYTProf wie folgt untersuchen.

$ perl -d:NYTProf factorial.pl

Devel::NYTProf erzeugt im aktuellen Verzeichnis die Datei nytprof.out, die sich mit den mitgelieferten Werkzeugen nytprofhtml bzw. nytprofcsv anzeigen lässt.

nytprofcsv

nytprofcsv bereitet das Profiling in betriebssystem-unabhängigen CSV-Dateien, die bequem mit Excel oder Open-Office.org geöffnet werden können, auf. Für jede Zeile Code werden die verbrauchte Zeit, die Anzahl Aufrufe und die Zeit/Aufruf angezeigt.

$ nytprofcsv 
Generating CSV report...
Reading nytprof.out
Writing report to nytprof directory

nytprofcsv erzeugt einen Unterordner nytprof, in dem die Profiling-Ergebnisse abgelegt werden.

$ ls -1 nytprof
factorial.pl-block.csv
factorial.pl-line.csv
factorial.pl-sub.csv
strict.pm-block.csv
strict.pm-line.csv
strict.pm-sub.csv
warnings.pm-block.csv
warnings.pm-line.csv
warnings.pm-sub.csv

Das muss man sich einfach mal in einer Tabellenkalkulation ansehen, dann weiß man sofort, wie es funktioniert.

nytprofhtml

nytprofhtml erzeugt ebenfalls einen Unterordner nytprof, in dem die Profiling-Ergebnisse als HTML-Dateien abgelegt werden.

$ nytprofhtml nytprof.out 
Generating report...
Reading nytprof.out
Writing report to nytprof directory
$ ls -1 nytprof
factorial.pl-block.html
factorial.pl-line.html
factorial.pl-sub.html
index.html
index-subs-excl.html
index-subs-incl.html
jquery.min.js
jquery.tablesorter.min.js
strict.pm-block.html
strict.pm-line.html
strict.pm-sub.html
style.css
warnings.pm-block.html
warnings.pm-line.html
warnings.pm-sub.html

Die HTML-Ausgabe sieht zunächst einmal rattenscharf aus:

NYTPP01_klein.png

und enthält alle Details, die benötigt werden, um Zeitdiebe auf zu finden.

Mein Fazit

Devel::NYTProf ist der derzeit beste Profiler für Perl und gehört in den Werkzeugkasten eines jeden Entwicklers.

Danke New York Times

Ein ganz besonderen Dank an die New York Times, die ihren Angestellten erlaubt, ein derart geiles Tool als Open-Source zu veröffentlichen.

Siehe auch:

Weitere Posts