Neues in der Kategorie Profiler

GraphViz::ISA - Graphing class hierarchies at run-time von Marcel Grünauer ermöglicht die graphische Darstellung des @ISA.

Beispiel

Das folgende Beispielprogramm habe ich der Distribution von GraphViz::ISA entnommen:

#!/usr/bin/perl
# The hierarchy shown here is based on an example Damian Conway's book
# "Object Oriented Perl"
#
# Usage:  ./isatest.pl >isa.png
#
######################################################################
# https://github.com/hanekomu/GraphViz-ISA/blob/master/eg/isatest.pl #
######################################################################
use warnings;
use strict;
use GraphViz::ISA;
sub Coder::new      { bless {}, (ref($_[0]) || $_[0]) }
sub Documenter::new { bless {}, (ref($_[0]) || $_[0]) }
@Programmer::ISA = qw(Coder Documenter);
sub Obfuscator::new { bless {}, (ref($_[0]) || $_[0]) }
@Perl::Hacker::ISA = qw(Programmer Obfuscator);
sub Writer::new           { bless {}, (ref($_[0]) || $_[0]) }
sub Humorist::new         { bless {}, (ref($_[0]) || $_[0]) }
sub One::Sick::Puppy::new { bless {}, (ref($_[0]) || $_[0]) }
@Punmeister::ISA = qw(Writer Humorist One::Sick::Puppy);
sub Language::Maestro::new { bless {}, (ref($_[0]) || $_[0]) }
sub Educator::new          { bless {}, (ref($_[0]) || $_[0]) }
@Perl::Guru::ISA = qw(Perl::Hacker Language::Maestro Educator Punmeister);
my $p = Perl::Guru->new;
my $g = GraphViz::ISA->new($p);
print $g->as_png;

Das Programm erzeugt folgende Graphik:

graphviz-isa-klein.png

Siehe auch

Devel::TraceUse von Philippe Bruhat (BooK) zeigt die Module, die von einem Perl-Programm genutzt werden, übersichtlich an.

Verwendete Module auflisten

Devel::TraceUse wird auf der Kommandozeile aufgerufen

$ perl -d:TraceUse your_program.pl

Devel::TraceUse erzeugt aus dem folgenden Beispielprogramm:

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

use DBI;

folgende Ausgabe:

Modules used from hierachy.pl:
   1.  strict 1.04, hierachy.pl line 2 [main]
   2.  warnings 1.09, hierachy.pl line 3 [main]
   3.  DBI 1.615, hierachy.pl line 5 [main]
   4.    Carp 1.17, DBI.pm line 159
   5.      Exporter 5.64_01, Carp.pm line 11
  11.        Exporter::Heavy 5.64_01, Exporter.pm line 16
   6.    DynaLoader 1.10, DBI.pm line 160
   7.      Config, DynaLoader.pm line 25
   9.        Config_heavy.pl, Config.pm line 70
  10.          Config_git.pl, Config_heavy.pl line 1224 [Config]
   8.      AutoLoader 5.70, DynaLoader.pm line 22
  12.    Scalar::Util 1.23, DBI.pm line 290
  13.      vars 1.01, Scalar/Util.pm line 10
  14.        warnings::register 1.01, vars.pm line 7
  15.      List::Util 1.23, Scalar/Util.pm line 12
  16.        XSLoader 0.10, List/Util.pm line 26

Die Ausgabe der Core-Module lässt sich über den Schalter =hidecore unterdrücken.

$ perl -d:TraceUse=hidcore your_program.pl

und erzeugt dann für o.g. Beispiel folgende Ausgabe:

Modules used from hierachy.pl:
   3.  DBI 1.615, hierachy.pl line 5 [main]
   9.    Config_heavy.pl, Config.pm line 70
  10.      Config_git.pl, Config_heavy.pl line 1224 [Config]

 

Visualisierung der verwendeten Module

Die Ausgabe von Devel::TraceUse lässt sich mittels eines einfachen Hacks mit GraphViz visualisieren.

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

use GraphViz;

###########################################################
# Works for me Software(TM)
###########################################################
# Usage:
# Step 1:
# perl -d:TraceUse your-programm.pl 2> TraceUse.out.txt
# or
# perl -d:TraceUse=hidecore your-programm.pl 2> TraceUse.out.txt
# Step2:
# perl $0  TraceUse.out.txt 
###########################################################
# Based on http://use.perl.org/~BooK/journal/34717
###########################################################

#my $png = shift || 'use.png';
my $png =  'trace-use.png';

my $g = GraphViz->new( rankdir => 1 );

my @stack;

while (<>) {

    # Do not graph standard pragmas
    next if m/warnings\s+\d+/;
    next if m/strict\s+\d+/;

    # Remove leading line numbers
    s/^\s+\d+\.//;
	
    # first node
    /^Modules used from (.*):/ && do {
        $g->add_node($1);
        @stack = ($1);
    };

    # all other nodes
    /^((?:  )+)(\S+).*,/ && do {
        my $idx = length($1) / 2;
        $stack[$idx] = $2;
        $g->add_node($2);
        $g->add_edge( $stack[ $idx - 1 ] => $2 );
    };

    # ignore all other lines
}

$g->as_png($png);

Das Programm erzeugt mit o.g. Beispiel folgende Graphik:

trace-use-small.png

 

Siehe auch

Über dieses Archiv

Diese Seite enthält aktuelle Einträge der Kategorie Profiler.

Net ist die vorherige Kategorie.

Talks ist die nächste Kategorie.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Fachzeitschriften

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.