Article 12913 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:12913
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.utdallas.edu!corpgate!bnrgate!nott!torn!howland.reston.ans.net!pipex!uunet!butch!enterprise!news
From: schip@sgi428 (Jan Schipmolder)
Subject: Re: Perl Profiling ?
Message-ID: <[email protected]>
Sender: [email protected] (News Administrator)
Organization: Lockheed Missiles & Space Co.
X-Newsreader: Tin 1.1 PL4
References: <[email protected]>
Date: Wed, 20 Apr 94 04:22:09 GMT
Lines: 151

[email protected] (Thomas Mohr US/ESC 60/3/151 #71796) writes:
: I'm looking for some profiling package on perl. Does anybody in netland

I wrote this profiler. It works for me. I did not document the
assumptions it makes about your coding style. But if you run it
with the -h option it should give you some usage information. Hope
this help. Toodeloo.

===== from here till next =====
#!/usr/local/bin/perl

require 'getopts.pl';
&Getopts ( 'hpx' ) || ( &usage, exit ) ;

&usage, exit if $opt_h;

die "cannot use both p and x options\n" if $opt_p && $opt_x;
die "must have exactly one of p or x options\n" if !$opt_p && !$opt_x;

if ( $opt_x ) {

  # This is the part of plprof that creates a new script out of the one
  # offered on the command line.

  read_x: while ( <> ) {

     # keep reading lines till you see an isolated __END__, if any
     next read_x if /^\s*$/; # ignore blank lines
     next read_x if /^\s*\#/ && $. > 1 ; # ignore obvious comment lines
     last read_x if /^\s*__END__\s*$/;

     # On any line that ends with an {, append a statement that counts
     # the number of passages.

     if ( /{\s*$/ ) {
        $x = sprintf ( "{ \$_KOUNT[%d]++;", $_iKOUNT++ );
        s/{\s*$/$x\n/;
     }
     print;
  }

  # Now, at the end of the input file, append statements that output
  # the accumulated counts to a file named a.perlprofile.

  print 'open ( _FILE, ">a.perlprofile" ) || ', "\n";
  print 'die "cannot open >a.perlprofile\n";', "\n";

  print ' for ( $_jKOUNT=0; $_jKOUNT<',$_iKOUNT,'; $_jKOUNT++ ) { ', "\n";
  print '   print _FILE $_KOUNT [ $_jKOUNT ], "\n"; ', "\n";
  print ' } ', "\n";

} elsif ( $opt_p ) {

  # This is the part of plprof that reads the original script (from the
  # command line) as well as the counts accumulated by the modified
  # script in a.perlprofile.

  open ( _FILE, "<a.perlprofile" ) ||
  die "cannot open <a.perlprofile\n";

  read_p: while ( <> ) {

     s/\s*$//;

     # Don't bother with anything after the __END__
     next read_p if /^\s*$/; # ignore blank lines
     next read_p if /^\s*\#/ && $. > 1; # ignore obvious comment lines
     last read_p if /^\s*__END__\s*$/;

     if ( /{\s*$/ ) {
        $kount = <_FILE>;
        printf ( "%5d %s\n", $kount, substr($_,0,75) );
     } else {
        printf ( "%5s %s\n", ' ', substr($_,0,75) );
     }
  }

} else {
  die "coding error 0835\n"
}


sub usage {
  print <DATA>;
}

__END__

Name:
  plprof

Purpose:
  profile a perl script (count number of executions of statements)

Usage:
  to make the profile:
     plprof -x yourscript > anyname
     chmod 755 anyname
     anyname yourargs
  to print the profile
     plprof -p yourscript

where:
  -x -- causes plprof to make anyname out of yourscript
  -p -- causes plprof to read stats from anyname and print them
  yourscript -- the script you want to profile
  anyname    -- the temporary script you run instead of yourscript
  yourargs   -- the arguments expected by yourscript

Example:
  plprof -x dirSize > a.Dummy
  chmod +x a.Dummy
  a.Dummy alfa 3 beta
  plprof -p dirSize

     In this example, we want to see how many times each perl
     statement in dirSize gets executed.

     To that effect, we first convert dirSize to a.Dummy, which is a
     modified version of dirSize, having additional counting
     statements appended to any line in dirSize that ends with a left
     curly bracket.

     After making a.Dummy executable, you run it, feeding it the
     arguments you would normally feed to dirSize, "alfa 3 beta" in
     this case.

     While you are running a.Dummy, a file named a.perlprofile is
     being created, containing the stats needed for the second
     execution of plprof.

     Finally, you run plprof a second time, telling it the name of
     the script with which you started (dirSize). Plprof reads both
     a.perlprofile and dirSize, and prints a modified version of
     dirSize, one showing the stats accumulated by a.Dummy. In the
     left margin of the printout, on each line that ends with a left
     curly bracket, is shown the number of times that dirSize "passed
     through that bracket".

Notes:

(*) Should, but does not, check for lines in yourscript that start
   with "#". It makes no sense profiling comment lines ...

--
jan b schipmolder
=====

--
jan b schipmolder
[email protected]