TStanley has asked for the wisdom of the Perl Monks concerning the following question:

While reading through Higher Order Perl, I came across this particular item at the end of Chapter 3, Caching and Memoization:
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}; } }
My question is how would you actually add this into the code that you wish to profile? Do you add the profile sub to to the program and then call it as neccesary, or work the code that you need to profile into the sub?

TStanley
--------
The only thing necessary for the triumph of evil is for good men to do nothing -- Edmund Burke

Replies are listed 'Best First'.
Re: Profiling code
by planetscape (Chancellor) on Nov 21, 2005 at 13:25 UTC
Re: Profiling code
by japhy (Canon) on Nov 21, 2005 at 12:57 UTC
    There appears to be something missing from that code. $func and $name have no means of being populated, and even if they were, nothing gets done with $stub after it's been created. If you change the first line to my ($func, $name) = @_;, then I believe you can change thing_to_profile(@args) to profile(\&thing_to_profile, "thing_to_profile")->(@args) and the code will work as expected.

    Jeff japhy Pinyan, P.L., P.M., P.O.D, X.S.: Perl, regex, and perl hacker
    How can we ever be the sold short or the cheated, we who for every service have long ago been overpaid? ~~ Meister Eckhart