use Time::HiRes 'time'; my (%time,%calls); sub profile{ my ($func,$name); my $stub=sub{ my $start=time; my $return=$func->(@_); my $end=time; my $elapsed=$end-$start; $calls{$name}+=1; $time{$name}+=$elapsed; return $return; }; } END{ printf STDERR "%-12s %9s %6s\n","Function","# Calls","Elapsed"; for my $name (sort {$time{$b} <=> $time{$a}} (keys %time)){ printf "%-12s %9d %6.2f\n", $name, $calls{$name},$time{$name}; } }