Author: tim.bunce
Date: Thu Jul 2 14:53:40 2009
New Revision: 794
Modified:
trunk/NYTProf.xs
trunk/t/lib/NYTProfTest.pm
trunk/t/test10.rdt
trunk/t/test30-fork-0.rdt
trunk/t/test60-subname.p
trunk/t/test60-subname.rdt
trunk/t/test80-recurs.rdt
Log:
Merge pp_sysop_profiler into pp_entersub_profiler.
Enable sysops=1 for all tests.
Modified: trunk/NYTProf.xs
==============================================================================
--- trunk/NYTProf.xs (original)
+++ trunk/NYTProf.xs Thu Jul 2 14:53:40 2009
@@ -330,6 +330,7 @@
orig_ppaddr_t *PL_ppaddr_orig;
#define run_original_op(type) CALL_FPTR(PL_ppaddr_orig[type])(aTHX)
static OP *pp_entersub_profiler(pTHX);
+static OP *pp_subcall_profiler(pTHX_ int type);
static OP *pp_leave_profiler(pTHX);
static HV *sub_callers_hv;
static HV *pkg_fids_hv; /* currently just package names */
@@ -2207,15 +2208,30 @@
static OP *
pp_entersub_profiler(pTHX)
{
+ return pp_subcall_profiler(aTHX_ 0);
+}
+
+static OP *
+pp_sysop_profiler(pTHX)
+{
+ return pp_subcall_profiler(aTHX_ 1);
+}
+
+static OP *
+pp_subcall_profiler(pTHX_ int is_sysop)
+{
OP *op;
COP *prev_cop = PL_curcop; /* not PL_curcop_nytprof
here */
OP *next_op = PL_op->op_next; /* op to execute after
sub returns */
+ /* pp_entersub can be called with PL_op->op_type==0 */
+ OPCODE op_type = (is_sysop) ? PL_op->op_type : OP_ENTERSUB;
dSP;
- SV *sub_sv = *SP;
+ SV *sub_sv;
sub_call_start_t sub_call_start;
int profile_sub_call = (profile_subs && is_profiling);
if (profile_sub_call) {
+ sub_sv = *SP;
int saved_errno = errno;
if (!profile_stmts)
reinit_if_forked(aTHX);
@@ -2231,7 +2247,7 @@
* for XS subs pp_entersub executes the entire sub
* and returns the op *after* the sub (PL_op->op_next)
*/
- op = run_original_op(OP_ENTERSUB); /* may croak */
+ op = run_original_op(op_type); /* may croak */
if (profile_sub_call) {
int saved_errno = errno;
@@ -2252,56 +2268,68 @@
SV *sv_tmp;
char *stash_name = NULL;
CV *cv;
- int is_xs;
+ char *is_xs;
- if (op != next_op) { /* have entered a sub */
- /* use cv of sub we've just entered to get name */
- cv = cxstack[cxstack_ix].blk_sub.cv;
- is_xs = 0;
- }
- else { /* have returned from XS
so use sub_sv for name */
- /* determine the original fully qualified name for sub */
- /* CV or NULL */
- cv = (CV *)resolve_sub(aTHX_ sub_sv, subname_sv);
- is_xs = 1;
- }
-
- if (cv && CvGV(cv)) {
- GV *gv = CvGV(cv);
- /* Class::MOP can create CvGV where SvTYPE of GV is SVt_NULL */
- if (SvTYPE(gv) == SVt_PVGV && GvSTASH(gv)) {
- /* for a plain call of an imported sub the GV is of the
current
- * package, so we dig to find the original package
- */
- stash_name = HvNAME(GvSTASH(gv));
- sv_setpvf(subname_sv, "%s::%s", stash_name, GvNAME(gv));
- }
- else if (trace_level) {
- logwarn("I'm confused about CV %p", cv);
- /* looks like Class::MOP doesn't give the CV GV stash a
name */
- if (trace_level >= 2)
- sv_dump((SV*)cv); /* coredumps in Perl_do_gvgv_dump,
looks line GvXPVGV is false, presumably on a Class::MOP wierdo sub */
- }
+ if (is_sysop) {
+ /* pretend builtins are xsubs in the same package
+ * but with "CORE:" (one colon) prepended to the name.
+ */
+ cv = NULL;
+ is_xs = "sysop";
+ stash_name = CopSTASHPV(PL_curcop);
+ sv_setpvf(subname_sv, "%s::CORE:%s", stash_name,
OP_NAME_safe(PL_op));
+ subname_pv = SvPV_nolen(subname_sv);
}
-
- if (!SvOK(subname_sv)) {
-
- if (!cv) {
- /* should never get here as pp_entersub would have croaked
*/
- const char *what = (is_xs) ? "xs" : "sub";
- logwarn("unknown entersub %s '%s'", what,
SvPV_nolen(sub_sv));
- if (trace_level)
- sv_dump(sub_sv);
- sv_setpvf(subname_sv, "(unknown %s %s)", what,
SvPV_nolen(sub_sv));
+ else {
+ if (op != next_op) { /* have entered a
sub */
+ /* use cv of sub we've just entered to get name */
+ cv = cxstack[cxstack_ix].blk_sub.cv;
+ is_xs = NULL;
+ }
+ else { /* have returned
from XS so use sub_sv for name */
+ /* determine the original fully qualified name for sub */
+ /* CV or NULL */
+ cv = (CV *)resolve_sub(aTHX_ sub_sv, subname_sv);
+ is_xs = "xsub";
+ }
+
+ if (cv && CvGV(cv)) {
+ GV *gv = CvGV(cv);
+ /* Class::MOP can create CvGV where SvTYPE of GV is
SVt_NULL */
+ if (SvTYPE(gv) == SVt_PVGV && GvSTASH(gv)) {
+ /* for a plain call of an imported sub the GV is of
the current
+ * package, so we dig to find the original package
+ */
+ stash_name = HvNAME(GvSTASH(gv));
+ sv_setpvf(subname_sv, "%s::%s", stash_name,
GvNAME(gv));
+ }
+ else if (trace_level) {
+ logwarn("I'm confused about CV %p", cv);
+ /* looks like Class::MOP doesn't give the CV GV stash
a name */
+ if (trace_level >= 2)
+ sv_dump((SV*)cv); /* coredumps in
Perl_do_gvgv_dump, looks line GvXPVGV is false, presumably on a Class::MOP
wierdo sub */
+ }
}
- else {
- /* unnamed CV, e.g. seen in mod_perl/Class::MOP. XXX do
better? */
- stash_name = HvNAME(CvSTASH(cv));
- sv_setpvf(subname_sv, "%s::__UNKNOWN__[0x%lx]",
- (stash_name)?stash_name:"__UNKNOWN__", (unsigned
long)cv);
- if (trace_level) {
- logwarn("unknown entersub %s assumed to be anon
cv '%s'", (is_xs) ? "xs" : "sub", SvPV_nolen(sub_sv));
- sv_dump(sub_sv);
+
+ if (!SvOK(subname_sv)) {
+
+ if (!cv) {
+ /* should never get here as pp_entersub would have
croaked */
+ const char *what = (is_xs) ? is_xs : "sub";
+ logwarn("unknown entersub %s '%s'", what,
SvPV_nolen(sub_sv));
+ if (trace_level)
+ sv_dump(sub_sv);
+ sv_setpvf(subname_sv, "(unknown %s %s)", what,
SvPV_nolen(sub_sv));
+ }
+ else {
+ /* unnamed CV, e.g. seen in mod_perl/Class::MOP. XXX
do better? */
+ stash_name = HvNAME(CvSTASH(cv));
+ sv_setpvf(subname_sv, "%s::__UNKNOWN__[0x%lx]",
+ (stash_name)?stash_name:"__UNKNOWN__", (unsigned
long)cv);
+ if (trace_level) {
+ logwarn("unknown entersub %s assumed to be anon
cv '%s'", (is_xs) ? is_xs : "sub", SvPV_nolen(sub_sv));
+ sv_dump(sub_sv);
+ }
}
}
}
@@ -2340,7 +2368,7 @@
av_store(av, NYTP_SCi_CALL_COUNT, newSVuv(0));
sv_setsv(*hv_fetch(hv, "0:0", 3, 1), newRV_noinc((SV
*)av));
- if (cv && SvTYPE(cv) == SVt_PVCV) {
+ if ((cv && SvTYPE(cv) == SVt_PVCV) || (is_xs && 's' ==
*is_xs)) {
/* We just use an empty string as the filename for
xsubs
* because CvFILE() isn't reliable on perl 5.8.[78]
* and the name of the .c file isn't very useful
anyway.
@@ -2377,7 +2405,7 @@
if (trace_level >= 2)
fprintf(stderr, " ->%s %s from %d:%d (d%d, oh %gt, sub %gs)\n",
- (is_xs) ? "xsub" : " sub", subname_pv, fid, line,
+ (is_xs) ? is_xs : " sub", subname_pv, fid, line,
sub_call_start.call_depth,
sub_call_start.current_overhead_ticks,
sub_call_start.current_subr_secs
@@ -2438,125 +2466,6 @@
}
-static OP *
-pp_sysop_profiler(pTHX) /* handles ops that make
slow system calls */
-{
- OP *next_op;
- COP *prev_cop = PL_curcop; /* not PL_curcop_nytprof
here */
- sub_call_start_t sysop_call_start;
- int profile_sysop_call = (profile_subs && is_profiling);
-
- if (profile_sysop_call) {
- int saved_errno = errno;
- if (!profile_stmts)
- reinit_if_forked(aTHX);
- get_time_of_day(sysop_call_start.sub_call_time);
- sysop_call_start.current_overhead_ticks =
cumulative_overhead_ticks;
- sysop_call_start.current_subr_secs = cumulative_subr_secs;
- SETERRNO(saved_errno, 0);
- }
-
- next_op = run_original_op(PL_op->op_type); /* may croak */
-
- if (profile_sysop_call) {
- int saved_errno = errno;
-
- /* get line, file, and fid for statement *before* the call */
-
- char *file = OutCopFILE(prev_cop);
- unsigned int fid;
- /* XXX could use same closest_cop as DB_stmt() but it doesn't seem
- * to be needed here. Line is 0 only when call is from embedded
- * C code like mod_perl (at least in my testing so far)
- */
- int line = CopLINE(prev_cop);
- char fid_line_key[50];
- int fid_line_key_len;
- char *stash_name = CopSTASHPV(PL_curcop);
- SV *subname_sv = newSV(0);
- char *subname_pv;
- SV *sv_tmp;
-
- /* pretend builtins are in a ...::CORE:: subpackage of the current
- * package. (We recklessly assume that won't clash with anything.)
- * That's much more useful than putting them all in one place.
- */
- sv_setpvf(subname_sv, "%s::CORE:%s", stash_name,
OP_NAME_safe(PL_op));
- subname_pv = SvPV_nolen(subname_sv);
-
- fid = (file == last_executed_fileptr)
- ? last_executed_fid
- : get_file_id(aTHX_ file, strlen(file), NYTP_FIDf_VIA_SUB);
- fid_line_key_len = sprintf(fid_line_key, "%u:%d", fid, line);
-
- /* { called_subname => { "fid:line" => [ count, incl_time ] } } */
- sv_tmp = *hv_fetch(sub_callers_hv, subname_pv,
- (I32)SvCUR(subname_sv), 1);
-
- /* XXX fid:line can be ambiguous, e.g sub foo { return sub { ... }
}
- * We could add subname_sv to the [ count, incl_time ] array
- * and check it on each call. To improve performance we could also
- * add the op and so avoid the string compare if the op's are the
same.
- * If there's a call with a different subname_sv value, then we
- * could interpose a hash to hold per-subname values:
- * old => { "fid:line" => [ count, incl_time, "sub1"
] }
- * new => { "fid:line" => { "sub1"=>[ count, incl_time
], "sub2"=>[...] } }
- */
-
- if (!SvROK(sv_tmp)) { /* autoviv hash ref - is first call of this
subname from anywhere */
- HV *hv = newHV();
- sv_setsv(sv_tmp, newRV_noinc((SV *)hv));
-
- if (1) { /* is_xs */
- /* create dummy item with fid=0 & line=0 to act as flag to
indicate xs */
- AV *av = new_sub_call_info_av(aTHX);
- av_store(av, NYTP_SCi_CALL_COUNT, newSVuv(0));
- sv_setsv(*hv_fetch(hv, "0:0", 3, 1), newRV_noinc((SV
*)av));
-
- SV *sv = *hv_fetch(GvHV(PL_DBsub), subname_pv,
(I32)SvCUR(subname_sv), 1);
- sv_setpv(sv, ":0-0"); /* empty file name */
- if (trace_level >= 2)
- logwarn("Adding fake DBsub entry for '%s' sysop\n",
subname_pv);
- }
- }
-
- /* drill-down to array of sub call information for this
fid_line_key */
- sv_tmp = *hv_fetch((HV*)SvRV(sv_tmp), fid_line_key,
fid_line_key_len, 1);
- if (!SvROK(sv_tmp)) { /* autoviv array ref */
- AV *av = new_sub_call_info_av(aTHX);
-
- sv_setsv(sv_tmp, newRV_noinc((SV *)av));
- sysop_call_start.sub_av = av;
-
- if (stash_name) /* note that a sub in this package was called
*/
- (void)hv_fetch(pkg_fids_hv, stash_name,
(I32)strlen(stash_name), 1);
- }
- else {
- sysop_call_start.sub_av = (AV *)SvRV(sv_tmp);
- sv_inc(AvARRAY(sysop_call_start.sub_av)[0]); /* ++call count */
- }
-
- if (trace_level >= 2)
- fprintf(stderr, " ->%s %s from %d:%d (d%d, oh %gt, sub %gs)\n",
- "sysop", subname_pv, fid, line,
- sysop_call_start.call_depth,
- sysop_call_start.current_overhead_ticks,
- sysop_call_start.current_subr_secs
- );
-
- sysop_call_start.call_depth = 1; /* dummy */
- sysop_call_start.subname_sv = subname_sv;
- strcpy(sysop_call_start.fid_line, fid_line_key);
- /* acculumate now time we've just spent in the sysop */
- incr_sub_inclusive_time(aTHX_ &sysop_call_start);
-
- SETERRNO(saved_errno, 0);
- }
-
- return next_op;
-}
-
-
static int
enable_profile(pTHX_ char *file)
{
@@ -2741,7 +2650,7 @@
sysopen open close readline rcatline getc read
print prtf sysread syswrite send recv
eof tell seek sysseek readdir telldir seekdir rewinddir
- crypt dbmopen dbmclose
+ rand srand dbmopen dbmclose
stat lstat readlink link unlink rename symlink truncate
sselect select pipe_op bind connect listen accept shutdown
ftatime ftblk ftchr ftctime ftdir fteexec fteowned fteread
@@ -2772,6 +2681,9 @@
PL_ppaddr[OP_OPEN_DIR] = pp_sysop_profiler;
PL_ppaddr[OP_CLOSEDIR] = pp_sysop_profiler;
PL_ppaddr[OP_READDIR] = pp_sysop_profiler;
+ PL_ppaddr[OP_RAND] = pp_sysop_profiler;
+ PL_ppaddr[OP_SRAND] = pp_sysop_profiler;
+ PL_ppaddr[OP_WAIT] = pp_sysop_profiler;
}
/* redirect opcodes for caller tracking */
Modified: trunk/t/lib/NYTProfTest.pm
==============================================================================
--- trunk/t/lib/NYTProfTest.pm (original)
+++ trunk/t/lib/NYTProfTest.pm Thu Jul 2 14:53:40 2009
@@ -84,6 +84,7 @@
for my $compress (@test_opt_compress) {
push @env_combinations, {
start => 'init',
+ sysops => 1,
leave => $leave,
use_db_sub => $use_db_sub,
savesrc => $savesrc,
Modified: trunk/t/test10.rdt
==============================================================================
--- trunk/t/test10.rdt (original)
+++ trunk/t/test10.rdt Thu Jul 2 14:53:40 2009
@@ -18,10 +18,12 @@
fid_block_time 1 1 2 2 [ 0 1 ]
fid_block_time 1 2 [ 0 1 ]
fid_fileinfo 1 [ test10.p 1 2 0 0 ]
+fid_fileinfo 1 sub main::CORE:sleep 0-0
fid_fileinfo 1 call 2 main::__ANON__[(eval 0)[test10.p:1]:1]
[ 1 0 0 0 0 0
0 ]
fid_fileinfo 1 eval 1 [ 1 0 ]
fid_fileinfo 2 [ (eval 0)[test10.p:1] 1 1 2 2 0 0 ]
fid_fileinfo 2 sub main::__ANON__[(eval 0)[test10.p:1]:1] 1-1
+fid_fileinfo 2 call 1 main::CORE:sleep [ 1 0 0 0 0 0 0
]
fid_line_time 1 1 0 0
fid_line_time 1 1 1 1
fid_line_time 1 1 2 1 [ 0 1 ]
@@ -35,5 +37,7 @@
profile_modes fid_block_time block
profile_modes fid_line_time line
profile_modes fid_sub_time sub
+sub_subinfo main::CORE:sleep [ 1 0 0 1 0 0 0 0 ]
+sub_subinfo main::CORE:sleep called_by 2 1 [ 1 0 0
0 0 0 0 ]
sub_subinfo main::__ANON__[(eval 0)[test10.p:1]:1] [ 2 1 1 1 0 0 0 0 ]
sub_subinfo main::__ANON__[(eval 0)[test10.p:1]:1] called_by 1
2 [ 1 0 0 0
0 0 0 ]
Modified: trunk/t/test30-fork-0.rdt
==============================================================================
--- trunk/t/test30-fork-0.rdt (original)
+++ trunk/t/test30-fork-0.rdt Thu Jul 2 14:53:40 2009
@@ -21,6 +21,7 @@
fid_block_time 1 20 [ 0 1 ]
fid_block_time 1 22 [ 0 1 ]
fid_fileinfo 1 [ test30-fork-0.p 1 2 0 0 ]
+fid_fileinfo 1 sub main::CORE:wait 0-0
fid_fileinfo 1 sub main::other 6-8
fid_fileinfo 1 sub main::postfork 10-13
fid_fileinfo 1 sub main::prefork 1-4
@@ -29,6 +30,7 @@
fid_fileinfo 1 call 15 main::prefork [ 1 0 0 0 0 0 0 ]
fid_fileinfo 1 call 19 main::postfork [ 1 0 0 0 0 0 0 ]
fid_fileinfo 1 call 20 main::other [ 1 0 0 0 0 0 0 ]
+fid_fileinfo 1 call 22 main::CORE:wait [ 1 0 0 0 0 0 0 ]
fid_line_time 1 2 [ 0 1 ]
fid_line_time 1 3 [ 0 1 ]
fid_line_time 1 7 [ 0 3 ]
@@ -50,6 +52,8 @@
profile_modes fid_block_time block
profile_modes fid_line_time line
profile_modes fid_sub_time sub
+sub_subinfo main::CORE:wait [ 1 0 0 1 0 0 0 0 ]
+sub_subinfo main::CORE:wait called_by 1 22 [ 1 0 0 0 0 0 0
]
sub_subinfo main::other [ 1 6 8 3 0 0 0 0 ]
sub_subinfo main::other called_by 1 3 [ 1 0 0 0 0 0 0
]
sub_subinfo main::other called_by 1 12 [ 1 0 0 0 0 0 0
]
Modified: trunk/t/test60-subname.p
==============================================================================
--- trunk/t/test60-subname.p (original)
+++ trunk/t/test60-subname.p Thu Jul 2 14:53:40 2009
@@ -18,6 +18,9 @@
my $subname = "Devel::NYTProf::Test::example_xsub";
&$subname("foo");
+# call builtin (will be recorded if sysops=1 option set)
+wait();
+
# XXX currently goto isn't noticed by the profiler
# it's as if the call never happened. This most frequently
# affects AUTOLOAD subs.
Modified: trunk/t/test60-subname.rdt
==============================================================================
--- trunk/t/test60-subname.rdt (original)
+++ trunk/t/test60-subname.rdt Thu Jul 2 14:53:40 2009
@@ -19,17 +19,20 @@
fid_block_time 1 16 [ 0 1 ]
fid_block_time 1 18 [ 0 1 ]
fid_block_time 1 19 [ 0 1 ]
-fid_block_time 1 24 [ 0 1 ]
-fid_block_time 1 25 [ 0 1 ]
+fid_block_time 1 22 [ 0 1 ]
+fid_block_time 1 27 [ 0 1 ]
+fid_block_time 1 28 [ 0 1 ]
fid_fileinfo 1 [ test60-subname.p 1 2 0 0 ]
fid_fileinfo 1 sub main::BEGIN 2-2
-fid_fileinfo 1 sub main::launch 24-24
+fid_fileinfo 1 sub main::CORE:wait 0-0
+fid_fileinfo 1 sub main::launch 27-27
fid_fileinfo 1 call 5 Devel::NYTProf::Test::example_xsub
[ 1 0 0 0 0 0 0 ]
fid_fileinfo 1 call 9 Devel::NYTProf::Test::example_xsub
[ 1 0 0 0 0 0 0 ]
fid_fileinfo 1 call 12 Devel::NYTProf::Test::example_xsub
[ 1 0 0 0 0 0 0 ]
fid_fileinfo 1 call 16 Devel::NYTProf::Test::example_xsub
[ 1 0 0 0 0 0 0 ]
fid_fileinfo 1 call 19 Devel::NYTProf::Test::example_xsub
[ 1 0 0 0 0 0 0 ]
-fid_fileinfo 1 call 25 main::launch [ 1 0 0 0 0 0 0 ]
+fid_fileinfo 1 call 22 main::CORE:wait [ 1 0 0 0 0 0 0 ]
+fid_fileinfo 1 call 28 main::launch [ 1 0 0 0 0 0 0 ]
fid_fileinfo 2 [ Devel/NYTProf/Test.pm 2 4 0 0 ]
fid_fileinfo 2 sub Devel::NYTProf::Test::example_sub 13-13
fid_fileinfo 2 sub Devel::NYTProf::Test::example_xsub 0-0
@@ -40,8 +43,9 @@
fid_line_time 1 16 [ 0 1 ]
fid_line_time 1 18 [ 0 1 ]
fid_line_time 1 19 [ 0 1 ]
-fid_line_time 1 24 [ 0 1 ]
-fid_line_time 1 25 [ 0 1 ]
+fid_line_time 1 22 [ 0 1 ]
+fid_line_time 1 27 [ 0 1 ]
+fid_line_time 1 28 [ 0 1 ]
fid_sub_time 1 5 [ 0 1 ]
fid_sub_time 1 9 [ 0 1 ]
fid_sub_time 1 12 [ 0 1 ]
@@ -49,8 +53,9 @@
fid_sub_time 1 16 [ 0 1 ]
fid_sub_time 1 18 [ 0 1 ]
fid_sub_time 1 19 [ 0 1 ]
-fid_sub_time 1 24 [ 0 1 ]
-fid_sub_time 1 25 [ 0 1 ]
+fid_sub_time 1 22 [ 0 1 ]
+fid_sub_time 1 27 [ 0 1 ]
+fid_sub_time 1 28 [ 0 1 ]
profile_modes fid_block_time block
profile_modes fid_line_time line
profile_modes fid_sub_time sub
@@ -62,5 +67,7 @@
sub_subinfo Devel::NYTProf::Test::example_xsub called_by 1
16 [ 1 0 0 0 0
0 0 ]
sub_subinfo Devel::NYTProf::Test::example_xsub called_by 1
19 [ 1 0 0 0 0
0 0 ]
sub_subinfo main::BEGIN [ 1 2 2 0 0 0 0 0 ]
-sub_subinfo main::launch [ 1 24 24 1 0 0 0 0 ]
-sub_subinfo main::launch called_by 1 25 [ 1 0 0 0 0 0 0
]
+sub_subinfo main::CORE:wait [ 1 0 0 1 0 0 0 0 ]
+sub_subinfo main::CORE:wait called_by 1 22 [ 1 0 0 0 0 0 0
]
+sub_subinfo main::launch [ 1 27 27 1 0 0 0 0 ]
+sub_subinfo main::launch called_by 1 28 [ 1 0 0 0 0 0 0
]
Modified: trunk/t/test80-recurs.rdt
==============================================================================
--- trunk/t/test80-recurs.rdt (original)
+++ trunk/t/test80-recurs.rdt Thu Jul 2 14:53:40 2009
@@ -15,7 +15,9 @@
fid_block_time 1 2 [ 0 6 ]
fid_block_time 1 7 [ 0 1 ]
fid_fileinfo 1 [ test80-recurs.p 1 2 0 0 ]
+fid_fileinfo 1 sub main::CORE:sleep 0-0
fid_fileinfo 1 sub main::recurs 1-5
+fid_fileinfo 1 call 3 main::CORE:sleep [ 2 0 0 0 0 0 0
]
fid_fileinfo 1 call 4 main::recurs [ 1 0 0 0 0 0 1 ]
fid_fileinfo 1 call 7 main::recurs [ 1 0 0 0 0 0 0 ]
fid_line_time 1 2 [ 0 2 ]
@@ -27,6 +29,8 @@
profile_modes fid_block_time block
profile_modes fid_line_time line
profile_modes fid_sub_time sub
+sub_subinfo main::CORE:sleep [ 1 0 0 2 0 0 0 0 ]
+sub_subinfo main::CORE:sleep called_by 1 3 [ 2 0 0
0 0 0 0 ]
sub_subinfo main::recurs [ 1 1 5 2 0 0 1 0 ]
sub_subinfo main::recurs called_by 1 4 [ 1 0 0 0 0 0 1
]
sub_subinfo main::recurs called_by 1 7 [ 1 0 0 0 0 0 0
]
--~--~---------~--~----~------------~-------~--~----~
You've received this message because you are subscribed to
the Devel::NYTProf Development User group.
Group hosted at: http://groups.google.com/group/develnytprof-dev
Project hosted at: http://perl-devel-nytprof.googlecode.com
CPAN distribution: http://search.cpan.org/dist/Devel-NYTProf
To post, email: [email protected]
To unsubscribe, email: [email protected]
-~----------~----~----~----~------~----~------~--~---