Re: [cpan #17773] Bug in Term::ReadKey being trigger by a bug in Term::ReadLine
[p5sagit/p5-mst-13.2.git] / ext / Devel / DProf / DProf.pm
index 8ec82d0..49ba6bc 100644 (file)
@@ -1,19 +1,4 @@
-# Devel::DProf - a Perl code profiler
-#  5apr95
-#  Dean Roehrich
-#
-# changes/bugs fixed since 01mar95 version:
-#  - record $pwd and build pathname for tmon.out
-#      (so the profile doesn't get lost if the process chdir's)
-# changes/bugs fixed since 03feb95 version:
-#  - fixed some doc bugs
-#  - added require 5.000
-#  - added -w note to bugs section of pod
-# changes/bugs fixed since 31dec94 version:
-#  - podified
-#
-
-require 5.000;
+use 5.006_001;
 
 =head1 NAME
 
@@ -21,10 +6,7 @@ Devel::DProf - a Perl code profiler
 
 =head1 SYNOPSIS
 
-       PERL5DB="use Devel::DProf;"
-       export PERL5DB
-
-       perl5 -d test.pl
+       perl -d:DProf test.pl
 
 =head1 DESCRIPTION
 
@@ -35,22 +17,17 @@ using the most time and which subroutines are being called most often.  This
 information can also be used to create an execution graph of the script,
 showing subroutine relationships.
 
-To use this package the PERL5DB environment variable must be set to the
-following value:
-
-       PERL5DB="use Devel::DProf;"
-       export PERL5DB
-
 To profile a Perl script run the perl interpreter with the B<-d> debugging
 switch.  The profiler uses the debugging hooks.  So to profile script
-"test.pl" the following command should be used:
+F<test.pl> the following command should be used:
 
-       perl5 -d test.pl
+       perl -d:DProf test.pl
 
-When the script terminates the profiler will dump the profile information
-to a file called I<tmon.out>.  The supplied I<dprofpp> tool can be used to
-interpret the information which is in that profile.  The following command
-will print the top 15 subroutines which used the most time:
+When the script terminates (or when the output buffer is filled) the
+profiler will dump the profile information to a file called
+F<tmon.out>.  A tool like I<dprofpp> can be used to interpret the
+information which is in that profile.  The following command will
+print the top 15 subroutines which used the most time:
 
        dprofpp
 
@@ -59,12 +36,144 @@ following command:
 
        dprofpp -T
 
-Consult the "dprofpp" manpage for other options.
+Consult L<dprofpp> for other options.
+
+=head1 PROFILE FORMAT
+
+The old profile is a text file which looks like this:
+
+       #fOrTyTwO
+       $hz=100;
+       $XS_VERSION='DProf 19970606';
+       # All values are given in HZ
+       $rrun_utime=2; $rrun_stime=0; $rrun_rtime=7
+       PART2
+       + 26 28 566822884 DynaLoader::import
+       - 26 28 566822884 DynaLoader::import
+       + 27 28 566822885 main::bar
+       - 27 28 566822886 main::bar
+       + 27 28 566822886 main::baz
+       + 27 28 566822887 main::bar
+       - 27 28 566822888 main::bar
+       [....]
+
+The first line is the magic number.  The second line is the hertz value, or
+clock ticks, of the machine where the profile was collected.  The third line
+is the name and version identifier of the tool which created the profile.
+The fourth line is a comment.  The fifth line contains three variables
+holding the user time, system time, and realtime of the process while it was
+being profiled.  The sixth line indicates the beginning of the sub
+entry/exit profile section.
+
+The columns in B<PART2> are:
+
+       sub entry(+)/exit(-) mark
+       app's user time at sub entry/exit mark, in ticks
+       app's system time at sub entry/exit mark, in ticks
+       app's realtime at sub entry/exit mark, in ticks
+       fully-qualified sub name, when possible
+
+With newer perls another format is used, which may look like this:
+
+        #fOrTyTwO
+        $hz=10000;
+        $XS_VERSION='DProf 19971213';
+        # All values are given in HZ
+        $over_utime=5917; $over_stime=0; $over_rtime=5917;
+        $over_tests=10000;
+        $rrun_utime=1284; $rrun_stime=0; $rrun_rtime=1284;
+        $total_marks=6;
+
+        PART2
+        @ 406 0 406
+        & 2 main bar
+        + 2
+        @ 456 0 456
+        - 2
+        @ 1 0 1
+        & 3 main baz
+        + 3
+        @ 141 0 141
+        + 2
+        @ 141 0 141
+        - 2
+        @ 1 0 1
+        & 4 main foo
+        + 4
+        @ 142 0 142
+        + & Devel::DProf::write
+        @ 5 0 5
+        - & Devel::DProf::write
+
+(with high value of $ENV{PERL_DPROF_TICKS}).  
+
+New C<$over_*> values show the measured overhead of making $over_tests
+calls to the profiler These values are used by the profiler to
+subtract the overhead from the runtimes.
+
+The lines starting with C<@> mark time passed from the previous C<@>
+line.  The lines starting with C<&> introduce new subroutine I<id> and
+show the package and the subroutine name of this id.  Lines starting
+with C<+>, C<-> and C<*> mark entering and exit of subroutines by
+I<id>s, and C<goto &subr>.
+
+The I<old-style> C<+>- and C<->-lines are used to mark the overhead
+related to writing to profiler-output file.
+
+=head1 AUTOLOAD
+
+When Devel::DProf finds a call to an C<&AUTOLOAD> subroutine it looks at the
+C<$AUTOLOAD> variable to find the real name of the sub being called.  See
+L<perlsub/"Autoloading">.
+
+=head1 ENVIRONMENT
+
+C<PERL_DPROF_BUFFER> sets size of output buffer in words.  Defaults to 2**14.
+
+C<PERL_DPROF_TICKS> sets number of ticks per second on some systems where
+a replacement for times() is used.  Defaults to the value of C<HZ> macro.
+
+C<PERL_DPROF_OUT_FILE_NAME> sets the name of the output file.  If not set,
+defaults to tmon.out.
 
 =head1 BUGS
 
-If perl5 is invoked with the B<-w> (warnings) flag then Devel::DProf will
-cause a large quantity of warnings to be printed.
+Builtin functions cannot be measured by Devel::DProf.
+
+With a newer Perl DProf relies on the fact that the numeric slot of
+$DB::sub contains an address of a subroutine.  Excessive manipulation
+of this variable may overwrite this slot, as in
+
+  $DB::sub = 'current_sub';
+  ...
+  $addr = $DB::sub + 0;
+
+will set this numeric slot to numeric value of the string
+C<current_sub>, i.e., to C<0>.  This will cause a segfault on the exit
+from this subroutine.  Note that the first assignment above does not
+change the numeric slot (it will I<mark> it as invalid, but will not
+write over it).
+
+Another problem is that if a subroutine exits using goto(LABEL),
+last(LABEL) or next(LABEL) then perl may crash or Devel::DProf will die
+with the error:
+
+   panic: Devel::DProf inconsistent subroutine return
+
+For example, this code will break under Devel::DProf:
+
+   sub foo {
+     last FOO;
+   }
+   FOO: {
+     foo();
+   }
+
+A pattern like this is used by Test::More's skip() function, for
+example.  See L<perldiag> for more details.
+
+Mail bug reports and feature requests to the perl5-porters mailing list at
+F<E<lt>perl5-porters@perl.orgE<gt>>.
 
 =head1 SEE ALSO
 
@@ -72,35 +181,33 @@ L<perl>, L<dprofpp>, times(2)
 
 =cut
 
-package DB;
+# This sub is needed for calibration.
+package Devel::DProf;
 
-# So Devel::DProf knows where to drop tmon.out.
-chop($pwd = `pwd`);
-$tmon = "$pwd/tmon.out";
-
-# This sub is replaced by an XS version after the profiler is bootstrapped.
-sub sub {
-#      print "nonXS DBsub($sub)\n";
-       $single = 0; # disable DB single-stepping
-       if( wantarray ){
-               @a = &$sub;
-               @a;
-       }
-       else{
-               $a = &$sub;
-               $a;
-       }
+sub NONESUCH_noxs {
+       return $Devel::DProf::VERSION;
 }
 
+package DB;
+
+#
+# As of perl5.003_20, &DB::sub stub is not needed (some versions
+# even had problems if stub was redefined with XS version).
+#
+
+# disable DB single-stepping
+BEGIN { $single = 0; }
+
 # This sub is needed during startup.
 sub DB { 
 #      print "nonXS DBDB\n";
 }
 
+use XSLoader ();
 
-require DynaLoader;
-@Devel::DProf::ISA = qw(DynaLoader);
+$Devel::DProf::VERSION = '20050603.00';  # this version not authorized by
+                                        # Dean Roehrich. See "Changes" file.
 
-bootstrap Devel::DProf;
+XSLoader::load 'Devel::DProf', $Devel::DProf::VERSION;
 
 1;