| Filename | /home/ss5/perl5/perlbrew/perls/perl-5.22.0/lib/site_perl/5.22.0/Sub/Defer.pm |
| Statements | Executed 32688 statements in 122ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 55 | 2 | 2 | 347µs | 828µs | Sub::Defer::defer_sub |
| 19 | 2 | 2 | 263µs | 9.31ms | Sub::Defer::undefer_sub |
| 11 | 1 | 1 | 35µs | 35µs | Sub::Defer::defer_info |
| 1 | 1 | 1 | 15µs | 27µs | Sub::Defer::BEGIN@6 |
| 1 | 1 | 1 | 6µs | 13µs | Sub::Defer::BEGIN@3 |
| 1 | 1 | 1 | 5µs | 12µs | Sub::Defer::BEGIN@27 |
| 1 | 1 | 1 | 4µs | 8µs | Sub::Defer::BEGIN@4 |
| 1 | 1 | 1 | 4µs | 32µs | Sub::Defer::BEGIN@5 |
| 1 | 1 | 1 | 700ns | 700ns | Search::Elasticsearch::Role::Logger::log_to (xsub) |
| 1 | 1 | 1 | 600ns | 600ns | Search::Elasticsearch::Role::Logger::log_as (xsub) |
| 1 | 1 | 1 | 600ns | 600ns | Search::Elasticsearch::Role::Logger::trace_to (xsub) |
| 1 | 1 | 1 | 500ns | 500ns | Search::Elasticsearch::Role::Logger::trace_as (xsub) |
| 0 | 0 | 0 | 0s | 0s | CHI::Stats::new |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::_bulk_class |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::_scroll_class |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::cat |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::cluster |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::ingest |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::nodes |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::snapshot |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Client::5_0::Direct::tasks |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Cxn::clear_handle |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::critical |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::criticalf |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::debug |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::debugf |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::deprecate_handle |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::error |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::errorf |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::is_critical |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::is_debug |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::is_error |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::is_info |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::is_warning |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::log_handle |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::trace |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::trace_handle |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::tracef |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::warning |
| 0 | 0 | 0 | 0s | 0s | Search::Elasticsearch::Role::Logger::warningf |
| 0 | 0 | 0 | 0s | 0s | Sub::Defer::CLONE |
| 0 | 0 | 0 | 0s | 0s | Sub::Defer::__ANON__[:65] |
| 0 | 0 | 0 | 0s | 0s | Sub::Defer::undefer_all |
| 0 | 0 | 0 | 0s | 0s | Sub::Defer::undefer_package |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Sub::Defer; | ||||
| 2 | |||||
| 3 | 2 | 14µs | 2 | 20µs | # spent 13µs (6+7) within Sub::Defer::BEGIN@3 which was called:
# once (6µs+7µs) by Sub::Quote::BEGIN@7 at line 3 # spent 13µs making 1 call to Sub::Defer::BEGIN@3
# spent 7µs making 1 call to Moo::_strictures::import |
| 4 | 2 | 13µs | 2 | 12µs | # spent 8µs (4+4) within Sub::Defer::BEGIN@4 which was called:
# once (4µs+4µs) by Sub::Quote::BEGIN@7 at line 4 # spent 8µs making 1 call to Sub::Defer::BEGIN@4
# spent 4µs making 1 call to Exporter::import |
| 5 | 2 | 14µs | 2 | 60µs | # spent 32µs (4+28) within Sub::Defer::BEGIN@5 which was called:
# once (4µs+28µs) by Sub::Quote::BEGIN@7 at line 5 # spent 32µs making 1 call to Sub::Defer::BEGIN@5
# spent 28µs making 1 call to Exporter::import |
| 6 | 2 | 123µs | 2 | 39µs | # spent 27µs (15+12) within Sub::Defer::BEGIN@6 which was called:
# once (15µs+12µs) by Sub::Quote::BEGIN@7 at line 6 # spent 27µs making 1 call to Sub::Defer::BEGIN@6
# spent 12µs making 1 call to Exporter::import |
| 7 | |||||
| 8 | 1 | 300ns | our $VERSION = '2.000002'; | ||
| 9 | 1 | 8µs | $VERSION = eval $VERSION; # spent 2µs executing statements in string eval | ||
| 10 | |||||
| 11 | 1 | 600ns | our @EXPORT = qw(defer_sub undefer_sub undefer_all); | ||
| 12 | 1 | 300ns | our @EXPORT_OK = qw(undefer_package); | ||
| 13 | |||||
| 14 | our %DEFERRED; | ||||
| 15 | |||||
| 16 | # spent 9.31ms (263µs+9.04) within Sub::Defer::undefer_sub which was called 19 times, avg 490µs/call:
# 16 times (245µs+8.85ms) by BenchmarkAnything::Storage::Search::Elasticsearch::Serializer::JSON::DontTouchMyUTF8::new or Method::Generate::Constructor::new or Search::Elasticsearch::Client::5_0::Direct::Indices::new or Search::Elasticsearch::Client::5_0::Direct::indices or Search::Elasticsearch::Client::5_0::Direct::new or Search::Elasticsearch::Cxn::Factory::new or Search::Elasticsearch::Cxn::HTTPTiny::new or Search::Elasticsearch::CxnPool::Static::new or Search::Elasticsearch::Logger::LogAny::new or Search::Elasticsearch::Role::Logger::_assert_log_handle or Search::Elasticsearch::Role::Logger::_assert_trace_handle or Search::Elasticsearch::Role::Logger::info or Search::Elasticsearch::Role::Logger::infof or Search::Elasticsearch::Role::Logger::is_trace or Search::Elasticsearch::Serializer::JSON::new or Search::Elasticsearch::Transport::new at line 63, avg 568µs/call
# 3 times (17µs+192µs) by Moo::_Utils::_install_modifier at line 40 of Moo/_Utils.pm, avg 70µs/call | ||||
| 17 | 19 | 7µs | my ($deferred) = @_; | ||
| 18 | my ($target, $maker, $undeferred_ref) = @{ | ||||
| 19 | 19 | 35µs | $DEFERRED{$deferred}||return $deferred | ||
| 20 | }; | ||||
| 21 | return ${$undeferred_ref} | ||||
| 22 | 17 | 4µs | if ${$undeferred_ref}; | ||
| 23 | 17 | 66µs | 17 | 9.01ms | ${$undeferred_ref} = my $made = $maker->(); # spent 7.37ms making 10 calls to Method::Generate::Constructor::__ANON__[Method/Generate/Constructor.pm:97], avg 737µs/call
# spent 1.63ms making 7 calls to Sub::Quote::__ANON__[Sub/Quote.pm:98], avg 233µs/call |
| 24 | |||||
| 25 | # make sure the method slot has not changed since deferral time | ||||
| 26 | 17 | 40µs | 17 | 27µs | if (defined($target) && $deferred eq *{_getglob($target)}{CODE}||'') { # spent 27µs making 17 calls to Moo::_Utils::_getglob, avg 2µs/call |
| 27 | 2 | 234µs | 2 | 19µs | # spent 12µs (5+7) within Sub::Defer::BEGIN@27 which was called:
# once (5µs+7µs) by Sub::Quote::BEGIN@7 at line 27 # spent 12µs making 1 call to Sub::Defer::BEGIN@27
# spent 7µ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 | ||||
| 31 | 17 | 17µs | 17 | 9µs | *{_getglob($target)} = $made; # spent 9µs making 17 calls to Moo::_Utils::_getglob, avg 541ns/call |
| 32 | } | ||||
| 33 | 17 | 21µs | $DEFERRED{$made} = $DEFERRED{$deferred}; | ||
| 34 | 17 | 4µs | weaken $DEFERRED{$made} | ||
| 35 | unless $target; | ||||
| 36 | |||||
| 37 | 17 | 51µs | return $made; | ||
| 38 | } | ||||
| 39 | |||||
| 40 | sub undefer_all { | ||||
| 41 | undefer_sub($_) for keys %DEFERRED; | ||||
| 42 | return; | ||||
| 43 | } | ||||
| 44 | |||||
| 45 | sub undefer_package { | ||||
| 46 | my $package = shift; | ||||
| 47 | my @subs = grep { $DEFERRED{$_}[0] =~ /^${package}::[^:]+$/ } keys %DEFERRED; | ||||
| 48 | undefer_sub($_) for @subs; | ||||
| 49 | return; | ||||
| 50 | } | ||||
| 51 | |||||
| 52 | # spent 35µs within Sub::Defer::defer_info which was called 11 times, avg 3µs/call:
# 11 times (35µs+0s) by Moo::_accessor_maker_for at line 132 of Moo.pm, avg 3µs/call | ||||
| 53 | 11 | 6µs | my ($deferred) = @_; | ||
| 54 | 11 | 32µs | my $info = $DEFERRED{$deferred||''} or return undef; | ||
| 55 | [ @$info ]; | ||||
| 56 | } | ||||
| 57 | |||||
| 58 | # spent 828µs (347+482) within Sub::Defer::defer_sub which was called 55 times, avg 15µs/call:
# 44 times (249µs+347µs) by Sub::Quote::quote_sub at line 98 of Sub/Quote.pm, avg 14µs/call
# 11 times (98µs+135µs) by Method::Generate::Constructor::install_delayed at line 97 of Method/Generate/Constructor.pm, avg 21µs/call | ||||
| 59 | 55 | 10µs | my ($target, $maker) = @_; | ||
| 60 | 55 | 6µs | my $undeferred; | ||
| 61 | my $deferred_info; | ||||
| 62 | my $deferred = sub { | ||||
| 63 | 16027 | 4.02ms | 16 | 9.10ms | $undeferred ||= undefer_sub($deferred_info->[3]); # spent 9.10ms making 16 calls to Sub::Defer::undefer_sub, avg 568µs/call |
| 64 | 16027 | 117ms | 16027 | 772ms | goto &$undeferred; # spent 204ms making 4004 calls to Search::Elasticsearch::Role::Logger::infof, avg 51µs/call
# spent 175ms making 2002 calls to Search::Elasticsearch::Role::Logger::is_trace, avg 87µs/call
# spent 94.3ms making 5005 calls to Search::Elasticsearch::Role::Logger::_assert_log_handle, avg 19µs/call
# spent 94.1ms making 2002 calls to Search::Elasticsearch::Role::Logger::_assert_trace_handle, avg 47µs/call
# spent 90.8ms making 2002 calls to Search::Elasticsearch::Role::Cxn::handle, avg 45µs/call
# spent 59.3ms making 1 call to Search::Elasticsearch::Cxn::Factory::new
# spent 39.0ms making 1001 calls to Search::Elasticsearch::Role::Logger::info, avg 39µs/call
# spent 9.65ms making 1 call to Search::Elasticsearch::CxnPool::Static::new
# spent 3.17ms making 1 call to Search::Elasticsearch::Client::5_0::Direct::indices
# spent 3.13ms making 1 call to Search::Elasticsearch::Cxn::HTTPTiny::new
# spent 89µs making 1 call to Search::Elasticsearch::Transport::new
# spent 32µs making 1 call to Search::Elasticsearch::Serializer::JSON::new
# spent 25µs making 1 call to BenchmarkAnything::Storage::Search::Elasticsearch::Serializer::JSON::DontTouchMyUTF8::new
# spent 13µs making 1 call to Search::Elasticsearch::Client::5_0::Direct::new
# spent 11µs making 1 call to Search::Elasticsearch::Logger::LogAny::new
# spent 9µs making 1 call to Search::Elasticsearch::Client::5_0::Direct::Indices::new
# spent 7µs making 1 call to Method::Generate::Constructor::new |
| 65 | 55 | 53µs | }; | ||
| 66 | 55 | 35µs | $deferred_info = [ $target, $maker, \$undeferred, $deferred ]; | ||
| 67 | 55 | 94µs | 55 | 28µs | weaken($deferred_info->[3]); # spent 28µs making 55 calls to Scalar::Util::weaken, avg 515ns/call |
| 68 | 55 | 93µs | 55 | 11µs | weaken($DEFERRED{$deferred} = $deferred_info); # spent 11µs making 55 calls to Scalar::Util::weaken, avg 200ns/call |
| 69 | 55 | 36µs | 45 | 442µs | _install_coderef($target => $deferred) if defined $target; # spent 442µs making 45 calls to Moo::_Utils::_install_coderef, avg 10µs/call |
| 70 | 55 | 76µs | return $deferred; | ||
| 71 | } | ||||
| 72 | |||||
| 73 | sub CLONE { | ||||
| 74 | %DEFERRED = map { defined $_ && $_->[3] ? ($_->[3] => $_) : () } values %DEFERRED; | ||||
| 75 | foreach my $info (values %DEFERRED) { | ||||
| 76 | weaken($info) | ||||
| 77 | unless $info->[0] && ${$info->[2]}; | ||||
| 78 | } | ||||
| 79 | } | ||||
| 80 | |||||
| 81 | 1 | 3µs | 1; | ||
| 82 | __END__ | ||||
# spent 600ns within Search::Elasticsearch::Role::Logger::log_as which was called:
# once (600ns+0s) by Search::Elasticsearch::Logger::LogAny::_build_log_handle at line 18 of Search/Elasticsearch/Logger/LogAny.pm | |||||
# spent 700ns within Search::Elasticsearch::Role::Logger::log_to which was called:
# once (700ns+0s) by Search::Elasticsearch::Logger::LogAny::_build_log_handle at line 15 of Search/Elasticsearch/Logger/LogAny.pm | |||||
# spent 500ns within Search::Elasticsearch::Role::Logger::trace_as which was called:
# once (500ns+0s) by Search::Elasticsearch::Logger::LogAny::_build_trace_handle at line 28 of Search/Elasticsearch/Logger/LogAny.pm | |||||
# spent 600ns within Search::Elasticsearch::Role::Logger::trace_to which was called:
# once (600ns+0s) by Search::Elasticsearch::Logger::LogAny::_build_trace_handle at line 25 of Search/Elasticsearch/Logger/LogAny.pm |