NAME
Devel::SmallProf - a small Perl profiler
SYNOPSIS
perl5 -d:SmallProf test.pl
DESCRIPTION
The Devel::SmallProf is a small profiler which I find useful (or at
least interesting :-) when used in conjuction with Devel::DProf. It
collects statistics on the run times of the lines in the various files
being run. Those statistics are placed in the file smallprof.out in one
of two formats. If `$DB::print_lines' is false (the default), it prints:
<num> <time> <file>:<line>
where <num> is the number of times that the line was executed, <time> is
the amount of time spent executing it and <file> and <line> are the
filename and line number, respectively.
If, on the other hand, `$DB::print_lines' is true, it print:
<num> <time> <text>
where <num> and <time> are as above and <text> is the actual text of the
executed line (read from the file). If the executed line, however, is in
an eval, no line is printed.
The package uses the debugging hooks in Perl and thus needs the -d
switch, so to profile test.pl, use the command:
perl5 -d:SmallProf test.pl
Once the script is done, the statistics in smallprof.out can be sorted
to show which lines took the most time. The output can be sorted to find
which lines take the longest, either with the sort command:
sort -nrk 2 smallprof.out | less
or a perl script:
open(PROF,"smallprof.out");
@sorted = sort {(split(/\s+/,$b))[2] <=>
(split(/\s+/,$a))[2]} <PROF>;
close PROF;
print join('',@sorted);
NOTES
* Determining the accuracy or signifiance of the results is left as an
exercise for the reader. I've tried to keep the timings pretty much
just to the profiled code, but no guarantees of any kind are made.
* SmallProf depends on `syscall()' and `gettimeofday()' (see the "syscall"
entry in the perlfunc manpage) to do its timings. If your system
lacks them SmallProf won't work.
* There is a variable called `$DB::profile_evals' which sets up some code
to try to help the programmer evaluate *which* eval is taking all
the time. You can activate this code by putting a
`BEGIN{$DB::profile_evals =1}' at the beginning of your script. It
is not clear whether this should be considered a feature or a bug.
See the section on "BUGS".
BUGS
The handling of evals is poor. The results, even with
`$DB::profile_evals' on, are ugly. The code to handle
`$DB::profile_evals' is even uglier. The eval profiling uses the
`@{"main::_<$filename"}' array to find the code which is currently being
executed. I expect that things could be improved somewhat by dealing
appropriately with packages, but the reference in the perldebug manpage
calls it only `@{"_<$filename"}'. As it is, the eval lines reported are
blank some of the time. Even when they show up, it can be hard to tell
where they originated.
Also, there has got to be a better way to switch that stuff on and off
than "bootstrapping" `&DB::DB'. If there is a slick, computationally
cheap way of dealing with evals, I'm intending to set it to always debug
evals and try to forget that I ever wrote kludge that is there now, but
it's there now because I'm trying to keep the expense of this module as
low as possible.
Comments, advice and insulting remarks about kludges are welcome. If you
see inefficent stuff in this module and have a better way, please let me
know.
AUTHOR
Ted Ashton <ashted@southern.edu>
SmallProf was developed from code orignally posted to usenet by Philippe
Verdret. I've attempted to contact him but have had no success.
Copyright (c) 1997 Ted Ashton
This module is free software and can be redistributed and/or modified
under the same terms as Perl itself.
SEE ALSO
the Devel::DProf manpage, the gettimeofday() manpage