smallprofpp
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
my $USAGE = "Usage: $0 [-c|-w] [profile]\n";
my $MAXLEN = 80;
getopts('cw', \my %opt) or die $USAGE;
my $profile = shift || 'smallprof.out';
open my $fh, '<', $profile
or die "Can't open profile: $!\n";
my ($header, $filename, @to_sort);
while (<$fh>)
{
$header = $_, next if /^\s+count/;
$filename = $1, next if /^\s+Profile of (.*?\S)\s+Page/;
/^\s+(\d+)\s+([\d.]+)\s+([\d.]+)\s+\d+:/
and $1 and push @to_sort, [ $_, $2, $3, $filename ];
}
my $which = $opt{c} ? 2 : 1; # Default: wall clock time
my $other = $which == 1 ? 2 : 1; # The other time
print $header,
map { (my $line = $_->[0]) =~ s/\b\s+(\d+):.*/ /s;
my $fileline = "$_->[3]:$1";
if (length($fileline) + length($line) > $MAXLEN)
{
substr($fileline,
0,
length($fileline)+length($line)-$MAXLEN+3,
'...');
}
"$line$fileline\n";
}
sort { $b->[$which] <=> $a->[$which]
|| $b->[$other] <=> $a->[$other]
} @to_sort;
__END__
=head1 NAME
smallprofpp - sort profile data from Devel::SmallProf
=head1 SYNOPSIS
smallprofpp [B<-c>|B<-w>] [profile]
=head1 DESCRIPTION
The I<smallprofpp> command sorts and outputs the named file
(default C<smallprof.out>) produced by Devel::SmallProf. Page
headings are removed and only one header line will be printed;
no lines will be printed for source code lines that were never
called (you can prevent Devel::SmallProf from outputting them
in the first place with the statement
$DB::drop_zeros = 1
which may be placed in a C<.smallprof> file; see
Devel::SmallProf). Lines will be sorted in descending order
of either cpu time or wall clock time; ties will be sorted by
the other time.
=head1 OPTIONS
=over 4
=item B<-c>
Sort first by cpu time, second by wall clock time.
=item B<-w>
Sort first by wall clock time, second by cpu time. This is the
default.
=back
=head1 SEE ALSO
L<Devel::SmallProf>.
|