The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
no warnings 'redefine';

my %times;
my %elapsed;
while (<>) {
	next unless m#([<>]) (\S+) ([.0-9]+)#;
	my $enter	= ($1 eq '>');
	my $sub		= $2;
	my $time	= $3;
	if ($enter) {
		push( @{ $times{ $sub } }, $time );
	} else {
		my $start	= pop( @{ $times{ $sub } } );
		my $elapsed	= $time - $start;
		$elapsed{ $sub }[0]++;
		$elapsed{ $sub }[1]	+= $elapsed;
	}
}

print "Calls\tS\t\tms/C\t\tSub\n";
foreach my $sub (sort { $elapsed{$b}[1] <=> $elapsed{$a}[1] } (keys %elapsed)) {
	my $calls	= $elapsed{$sub}[0];
	my $cum		= $elapsed{$sub}[1];
	my $cumc	= 1000 * $cum / $calls;
	printf("%d\t%f\t%f\t%s\n", $calls, $cum, $cumc, $sub);
}