{ package DB; use B; BEGIN { my $PROFILE="$0.profile"; open PROFILE,">",$PROFILE or die "$PROFILE:$!"; } sub DB {} my %skip=(); our $depth=0; sub sub { my $name=$sub; if (ref $name) { my $Bobj = B::svref_2object($sub); $name=$Bobj->GV->NAME(); } $name=~s/^main::/::/; if ( $skip{$name} or $name=~/^[a-z]+(::|$)/ or $name=~/^__ANON__/ ) { return &$sub; } my @time=(time,times); print PROFILE "> ",(" " x $depth),$name,"\n"; my (@array,$scalar); { local $depth=$depth+1; if (wantarray) { @array=&$sub; } elsif (defined wantarray) { $scalar=&$sub; } else { &$sub; } } my @after=(time,times); my $time=join(", ",map {$after[$_]-$time[$_] } 0..$#time); print PROFILE "< ",(" " x $depth),$name,"=$time","\n"; if (wantarray) { return @array } elsif (defined wantarray) { return $scalar } } } 1