← Index
NYTProf Performance Profile   « line view »
For index.cgi
  Run on Sat May 9 17:18:47 2020
Reported on Sat May 9 17:19:07 2020

Filename/usr/local/share/perl/5.18.2/Sub/Defer.pm
StatementsExecuted 80 statements in 1.15ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
42280µs148µsSub::Defer::::defer_subSub::Defer::defer_sub
32250µs12.3msSub::Defer::::undefer_subSub::Defer::undefer_sub
11123µs90µsSub::Defer::::BEGIN@6Sub::Defer::BEGIN@6
11113µs39µsSub::Defer::::BEGIN@3Sub::Defer::BEGIN@3
11112µs26µsSub::Defer::::BEGIN@27Sub::Defer::BEGIN@27
21111µs11µsSub::Defer::::defer_infoSub::Defer::defer_info
11110µs18µsSub::Defer::::BEGIN@4Sub::Defer::BEGIN@4
11110µs84µsSub::Defer::::BEGIN@5Sub::Defer::BEGIN@5
0000s0sSub::Defer::::CLONESub::Defer::CLONE
0000s0sSub::Defer::::__ANON__[:68]Sub::Defer::__ANON__[:68]
0000s0sSub::Defer::::undefer_allSub::Defer::undefer_all
0000s0sSub::Defer::::undefer_packageSub::Defer::undefer_package
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Sub::Defer;
2
3234µs266µs
# spent 39µs (13+27) within Sub::Defer::BEGIN@3 which was called: # once (13µs+27µs) by Sub::Quote::BEGIN@7 at line 3
use Moo::_strictures;
# spent 39µs making 1 call to Sub::Defer::BEGIN@3 # spent 27µs making 1 call to Moo::_strictures::import
4237µs227µs
# spent 18µs (10+8) within Sub::Defer::BEGIN@4 which was called: # once (10µs+8µs) by Sub::Quote::BEGIN@7 at line 4
use Exporter qw(import);
# spent 18µs making 1 call to Sub::Defer::BEGIN@4 # spent 8µs making 1 call to Exporter::import
5236µs2158µs
# spent 84µs (10+74) within Sub::Defer::BEGIN@5 which was called: # once (10µs+74µs) by Sub::Quote::BEGIN@7 at line 5
use Moo::_Utils qw(_getglob _install_coderef);
# spent 84µs making 1 call to Sub::Defer::BEGIN@5 # spent 74µs making 1 call to Exporter::import
62202µs2158µs
# spent 90µs (23+68) within Sub::Defer::BEGIN@6 which was called: # once (23µs+68µs) by Sub::Quote::BEGIN@7 at line 6
use Scalar::Util qw(weaken);
# spent 90µs making 1 call to Sub::Defer::BEGIN@6 # spent 68µs making 1 call to Exporter::import
7
81900nsour $VERSION = '2.001000';
9116µs$VERSION = eval $VERSION;
# spent 3µs executing statements in string eval
10
1112µsour @EXPORT = qw(defer_sub undefer_sub undefer_all);
121500nsour @EXPORT_OK = qw(undefer_package);
13
141300nsour %DEFERRED;
15
16
# spent 12.3ms (50µs+12.3) within Sub::Defer::undefer_sub which was called 3 times, avg 4.11ms/call: # 2 times (46µs+12.3ms) by Method::Generate::Constructor::new or String::Markov::new at line 66, avg 6.16ms/call # once (4µs+0s) by Moo::_Utils::_install_modifier at line 45 of Moo/_Utils.pm
sub undefer_sub {
1732µs my ($deferred) = @_;
18 my ($target, $maker, $undeferred_ref) = @{
19310µs $DEFERRED{$deferred}||return $deferred
20 };
21 return ${$undeferred_ref}
2221µs if ${$undeferred_ref};
2327µs212.3ms ${$undeferred_ref} = my $made = $maker->();
# spent 12.3ms making 2 calls to Method::Generate::Constructor::__ANON__[Method/Generate/Constructor.pm:102], avg 6.14ms/call
24
25 # make sure the method slot has not changed since deferral time
2629µs27µs if (defined($target) && $deferred eq *{_getglob($target)}{CODE}||'') {
# spent 7µs making 2 calls to Moo::_Utils::_getglob, avg 3µs/call
272629µs241µs
# spent 26µs (12+14) within Sub::Defer::BEGIN@27 which was called: # once (12µs+14µs) by Sub::Quote::BEGIN@7 at line 27
no warnings 'redefine';
# spent 26µs making 1 call to Sub::Defer::BEGIN@27 # spent 14µs making 1 call to warnings::unimport
28
29 # I believe $maker already evals with the right package/name, so that
30 # _install_coderef calls are not necessary --ribasushi
3125µs23µs *{_getglob($target)} = $made;
# spent 3µs making 2 calls to Moo::_Utils::_getglob, avg 1µs/call
32 }
3323µs $DEFERRED{$made} = $DEFERRED{$deferred};
3421µs weaken $DEFERRED{$made}
35 unless $target;
36
37217µs return $made;
38}
39
40sub undefer_all {
41 undefer_sub($_) for keys %DEFERRED;
42 return;
43}
44
45sub undefer_package {
46 my $package = shift;
47 undefer_sub($_)
48 for grep {
49 my $name = $DEFERRED{$_} && $DEFERRED{$_}[0];
50 $name && $name =~ /^${package}::[^:]+$/
51 } keys %DEFERRED;
52 return;
53}
54
55
# spent 11µs within Sub::Defer::defer_info which was called 2 times, avg 5µs/call: # 2 times (11µs+0s) by Moo::_accessor_maker_for at line 132 of Moo.pm, avg 5µs/call
sub defer_info {
5621µs my ($deferred) = @_;
57213µs my $info = $DEFERRED{$deferred||''} or return undef;
58 [ @$info ];
59}
60
61
# spent 148µs (80+69) within Sub::Defer::defer_sub which was called 4 times, avg 37µs/call: # 2 times (47µs+63µs) by Method::Generate::Constructor::install_delayed at line 102 of Method/Generate/Constructor.pm, avg 55µs/call # 2 times (32µs+6µs) by Sub::Quote::quote_sub at line 107 of Sub/Quote.pm, avg 19µs/call
sub defer_sub {
6243µs my ($target, $maker) = @_;
6341µs my $undeferred;
644900ns my $deferred_info;
65 my $deferred = sub {
6626µs212.3ms $undeferred ||= undefer_sub($deferred_info->[3]);
# spent 12.3ms making 2 calls to Sub::Defer::undefer_sub, avg 6.16ms/call
67218µs2162µs goto &$undeferred;
# spent 147µs making 1 call to String::Markov::new # spent 14µs making 1 call to Method::Generate::Constructor::new
68411µs };
6945µs $deferred_info = [ $target, $maker, \$undeferred, $deferred ];
70431µs410µs weaken($deferred_info->[3]);
# spent 10µs making 4 calls to Scalar::Util::weaken, avg 3µs/call
71422µs44µs weaken($DEFERRED{$deferred} = $deferred_info);
# spent 4µs making 4 calls to Scalar::Util::weaken, avg 1µs/call
7248µs254µs _install_coderef($target => $deferred) if defined $target;
# spent 54µs making 2 calls to Moo::_Utils::_install_coderef, avg 27µs/call
73415µs return $deferred;
74}
75
76sub CLONE {
77 %DEFERRED = map { defined $_ && $_->[3] ? ($_->[3] => $_) : () } values %DEFERRED;
78 foreach my $info (values %DEFERRED) {
79 weaken($info)
80 unless $info->[0] && ${$info->[2]};
81 }
82}
83
8414µs1;
85__END__