Filename | /usr/share/perl5/YAML/Base.pm |
Statements | Executed 1017 statements in 5.46ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
21 | 21 | 2 | 2.70ms | 4.25ms | field | YAML::Base::
64 | 2 | 1 | 764µs | 764µs | new | YAML::Base::
21 | 1 | 1 | 296µs | 296µs | __ANON__[:162] | YAML::Base::
17 | 1 | 1 | 276µs | 1.25ms | __ANON__[:172] | YAML::Base::
34 | 2 | 1 | 110µs | 110µs | CORE:subst (opcode) | YAML::Base::
1 | 1 | 1 | 18µs | 44µs | BEGIN@165 | YAML::Base::
1 | 1 | 1 | 18µs | 22µs | BEGIN@3 | YAML::Base::
1 | 1 | 1 | 13µs | 36µs | BEGIN@75 | YAML::Base::
1 | 1 | 1 | 10µs | 22µs | BEGIN@4 | YAML::Base::
1 | 1 | 1 | 9µs | 9µs | BEGIN@5 | YAML::Base::
0 | 0 | 0 | 0s | 0s | XXX | YAML::Base::
0 | 0 | 0 | 0s | 0s | __ANON__[:124] | YAML::Base::
0 | 0 | 0 | 0s | 0s | __ANON__[:133] | YAML::Base::
0 | 0 | 0 | 0s | 0s | __ANON__[:146] | YAML::Base::
0 | 0 | 0 | 0s | 0s | die | YAML::Base::
0 | 0 | 0 | 0s | 0s | node_info | YAML::Base::
0 | 0 | 0 | 0s | 0s | warn | YAML::Base::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package YAML::Base; | ||||
2 | |||||
3 | 3 | 27µs | 2 | 25µs | # spent 22µs (18+4) within YAML::Base::BEGIN@3 which was called:
# once (18µs+4µs) by YAML::BEGIN@6 at line 3 # spent 22µs making 1 call to YAML::Base::BEGIN@3
# spent 4µs making 1 call to strict::import |
4 | 3 | 34µs | 2 | 34µs | # spent 22µs (10+12) within YAML::Base::BEGIN@4 which was called:
# once (10µs+12µs) by YAML::BEGIN@6 at line 4 # spent 22µs making 1 call to YAML::Base::BEGIN@4
# spent 12µs making 1 call to warnings::import |
5 | 3 | 401µs | 1 | 9µs | # spent 9µs within YAML::Base::BEGIN@5 which was called:
# once (9µs+0s) by YAML::BEGIN@6 at line 5 # spent 9µs making 1 call to YAML::Base::BEGIN@5 |
6 | |||||
7 | 1 | 800ns | our $VERSION = '0.71'; | ||
8 | 1 | 12µs | our @ISA = 'Exporter'; | ||
9 | 1 | 800ns | our @EXPORT = qw(field XXX); | ||
10 | |||||
11 | # spent 764µs within YAML::Base::new which was called 64 times, avg 12µs/call:
# 32 times (526µs+0s) by YAML::Load at line 33 of YAML.pm, avg 16µs/call
# 32 times (239µs+0s) by YAML::init_action_object at line 87 of YAML.pm, avg 7µs/call | ||||
12 | 320 | 845µs | my $class = shift; | ||
13 | $class = ref($class) || $class; | ||||
14 | my $self = bless {}, $class; | ||||
15 | while (@_) { | ||||
16 | my $method = shift; | ||||
17 | $self->$method(shift); | ||||
18 | } | ||||
19 | return $self; | ||||
20 | } | ||||
21 | |||||
22 | # Use lexical subs to reduce pollution of private methods by base class. | ||||
23 | 1 | 500ns | my ($_new_error, $_info, $_scalar_info, $parse_arguments, $default_as_code); | ||
24 | |||||
25 | sub XXX { | ||||
26 | require Data::Dumper; | ||||
27 | CORE::die(Data::Dumper::Dumper(@_)); | ||||
28 | } | ||||
29 | |||||
30 | 1 | 6µs | my %code = ( | ||
31 | sub_start => | ||||
32 | "sub {\n", | ||||
33 | set_default => | ||||
34 | " \$_[0]->{%s} = %s\n unless exists \$_[0]->{%s};\n", | ||||
35 | init => | ||||
36 | " return \$_[0]->{%s} = do { my \$self = \$_[0]; %s }\n" . | ||||
37 | " unless \$#_ > 0 or defined \$_[0]->{%s};\n", | ||||
38 | return_if_get => | ||||
39 | " return \$_[0]->{%s} unless \$#_ > 0;\n", | ||||
40 | set => | ||||
41 | " \$_[0]->{%s} = \$_[1];\n", | ||||
42 | sub_end => | ||||
43 | " return \$_[0]->{%s};\n}\n", | ||||
44 | ); | ||||
45 | |||||
46 | # spent 4.25ms (2.70+1.55) within YAML::Base::field which was called 21 times, avg 202µs/call:
# once (254µs+191µs) by YAML::Loader::BEGIN@6 at line 10 of YAML/Loader/Base.pm
# once (150µs+196µs) by C4::Search::BEGIN@34 at line 18 of YAML.pm
# once (192µs+104µs) by YAML::Loader::BEGIN@6 at line 13 of YAML/Loader/Base.pm
# once (131µs+112µs) by YAML::Loader::BEGIN@6 at line 17 of YAML/Loader/Base.pm
# once (125µs+91µs) by YAML::Loader::BEGIN@6 at line 16 of YAML/Loader/Base.pm
# once (137µs+65µs) by C4::Search::BEGIN@34 at line 20 of YAML.pm
# once (134µs+66µs) by C4::Search::BEGIN@34 at line 22 of YAML.pm
# once (113µs+75µs) by C4::Search::BEGIN@34 at line 19 of YAML.pm
# once (115µs+70µs) by YAML::Loader::BEGIN@6 at line 11 of YAML/Loader/Base.pm
# once (121µs+64µs) by YAML::Loader::BEGIN@6 at line 22 of YAML/Loader/Base.pm
# once (110µs+68µs) by YAML::Loader::BEGIN@6 at line 21 of YAML/Loader/Base.pm
# once (108µs+69µs) by YAML::Loader::BEGIN@6 at line 19 of YAML/Loader/Base.pm
# once (107µs+70µs) by YAML::Loader::BEGIN@6 at line 23 of YAML/Loader/Base.pm
# once (109µs+66µs) by YAML::Loader::BEGIN@6 at line 25 of YAML/Loader/Base.pm
# once (110µs+65µs) by YAML::Loader::BEGIN@6 at line 12 of YAML/Loader/Base.pm
# once (109µs+64µs) by YAML::Loader::BEGIN@6 at line 26 of YAML/Loader/Base.pm
# once (108µs+64µs) by YAML::Loader::BEGIN@6 at line 24 of YAML/Loader/Base.pm
# once (149µs+13µs) by YAML::Loader::BEGIN@6 at line 20 of YAML/Loader/Base.pm
# once (110µs+14µs) by YAML::Loader::BEGIN@6 at line 14 of YAML/Loader/Base.pm
# once (107µs+13µs) by YAML::Loader::BEGIN@6 at line 18 of YAML/Loader/Base.pm
# once (100µs+12µs) by YAML::Loader::BEGIN@6 at line 15 of YAML/Loader/Base.pm | ||||
47 | 336 | 2.55ms | my $package = caller; | ||
48 | 21 | 296µs | my ($args, @values) = &$parse_arguments( # spent 296µs making 21 calls to YAML::Base::__ANON__[YAML/Base.pm:162], avg 14µs/call | ||
49 | [ qw(-package -init) ], | ||||
50 | @_, | ||||
51 | ); | ||||
52 | my ($field, $default) = @values; | ||||
53 | $package = $args->{-package} if defined $args->{-package}; | ||||
54 | return if defined &{"${package}::$field"}; | ||||
55 | 17 | 1.25ms | my $default_string = # spent 1.25ms making 17 calls to YAML::Base::__ANON__[YAML/Base.pm:172], avg 74µs/call | ||
56 | ( ref($default) eq 'ARRAY' and not @$default ) | ||||
57 | ? '[]' | ||||
58 | : (ref($default) eq 'HASH' and not keys %$default ) | ||||
59 | ? '{}' | ||||
60 | : &$default_as_code($default); | ||||
61 | |||||
62 | my $code = $code{sub_start}; | ||||
63 | 4 | 10µs | if ($args->{-init}) { | ||
64 | my $fragment = $code{init}; | ||||
65 | $code .= sprintf $fragment, $field, $args->{-init}, ($field) x 4; | ||||
66 | } | ||||
67 | $code .= sprintf $code{set_default}, $field, $default_string, $field | ||||
68 | if defined $default; | ||||
69 | $code .= sprintf $code{return_if_get}, $field; | ||||
70 | $code .= sprintf $code{set}, $field; | ||||
71 | $code .= sprintf $code{sub_end}, $field; | ||||
72 | |||||
73 | my $sub = eval $code; # spent 1.72ms executing statements in string eval # includes 1.34ms spent executing 288 calls to 1 sub defined therein. # spent 1.03ms executing statements in string eval # includes 836µs spent executing 128 calls to 1 sub defined therein. # spent 867µs executing statements in string eval # includes 743µs spent executing 96 calls to 1 sub defined therein. # spent 832µs executing statements in string eval # includes 617µs spent executing 64 calls to 1 sub defined therein. # spent 675µs executing statements in string eval # includes 668µs spent executing 32 calls to 1 sub defined therein. # spent 616µs executing statements in string eval # includes 532µs spent executing 64 calls to 1 sub defined therein. # spent 563µs executing statements in string eval # includes 473µs spent executing 64 calls to 1 sub defined therein. # spent 372µs executing statements in string eval # includes 343µs spent executing 32 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # spent 9µs executing statements in string eval # spent 9µs executing statements in string eval # spent 8µs executing statements in string eval # spent 8µs executing statements in string eval # spent 6µs executing statements in string eval # spent 6µs executing statements in string eval # spent 6µs executing statements in string eval # spent 6µs executing statements in string eval # spent 6µs executing statements in string eval # spent 6µs executing statements in string eval # spent 6µs executing statements in string eval # spent 5µs executing statements in string eval | ||||
74 | die $@ if $@; | ||||
75 | 3 | 708µs | 2 | 59µs | # spent 36µs (13+23) within YAML::Base::BEGIN@75 which was called:
# once (13µs+23µs) by YAML::BEGIN@6 at line 75 # spent 36µs making 1 call to YAML::Base::BEGIN@75
# spent 23µs making 1 call to strict::unimport |
76 | *{"${package}::$field"} = $sub; | ||||
77 | return $code if defined wantarray; | ||||
78 | } | ||||
79 | |||||
80 | sub die { | ||||
81 | my $self = shift; | ||||
82 | my $error = $self->$_new_error(@_); | ||||
83 | $error->type('Error'); | ||||
84 | Carp::croak($error->format_message); | ||||
85 | } | ||||
86 | |||||
87 | sub warn { | ||||
88 | my $self = shift; | ||||
89 | return unless $^W; | ||||
90 | my $error = $self->$_new_error(@_); | ||||
91 | $error->type('Warning'); | ||||
92 | Carp::cluck($error->format_message); | ||||
93 | } | ||||
94 | |||||
95 | # This code needs to be refactored to be simpler and more precise, and no, | ||||
96 | # Scalar::Util doesn't DWIM. | ||||
97 | # | ||||
98 | # Can't handle: | ||||
99 | # * blessed regexp | ||||
100 | sub node_info { | ||||
101 | my $self = shift; | ||||
102 | my $stringify = $_[1] || 0; | ||||
103 | my ($class, $type, $id) = | ||||
104 | ref($_[0]) | ||||
105 | ? $stringify | ||||
106 | ? &$_info("$_[0]") | ||||
107 | : do { | ||||
108 | require overload; | ||||
109 | my @info = &$_info(overload::StrVal($_[0])); | ||||
110 | if (ref($_[0]) eq 'Regexp') { | ||||
111 | @info[0, 1] = (undef, 'REGEXP'); | ||||
112 | } | ||||
113 | @info; | ||||
114 | } | ||||
115 | : &$_scalar_info($_[0]); | ||||
116 | ($class, $type, $id) = &$_scalar_info("$_[0]") | ||||
117 | unless $id; | ||||
118 | return wantarray ? ($class, $type, $id) : $id; | ||||
119 | } | ||||
120 | |||||
121 | #------------------------------------------------------------------------------- | ||||
122 | $_info = sub { | ||||
123 | return (($_[0]) =~ qr{^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$}o); | ||||
124 | 1 | 2µs | }; | ||
125 | |||||
126 | $_scalar_info = sub { | ||||
127 | my $id = 'undef'; | ||||
128 | if (defined $_[0]) { | ||||
129 | \$_[0] =~ /\((\w+)\)$/o or CORE::die(); | ||||
130 | $id = "$1-S"; | ||||
131 | } | ||||
132 | return (undef, undef, $id); | ||||
133 | 1 | 2µs | }; | ||
134 | |||||
135 | $_new_error = sub { | ||||
136 | require Carp; | ||||
137 | my $self = shift; | ||||
138 | require YAML::Error; | ||||
139 | |||||
140 | my $code = shift || 'unknown error'; | ||||
141 | my $error = YAML::Error->new(code => $code); | ||||
142 | $error->line($self->line) if $self->can('line'); | ||||
143 | $error->document($self->document) if $self->can('document'); | ||||
144 | $error->arguments([@_]); | ||||
145 | return $error; | ||||
146 | 1 | 2µs | }; | ||
147 | |||||
148 | # spent 296µs within YAML::Base::__ANON__[/usr/share/perl5/YAML/Base.pm:162] which was called 21 times, avg 14µs/call:
# 21 times (296µs+0s) by YAML::Base::field at line 48, avg 14µs/call | ||||
149 | 105 | 231µs | my $paired_arguments = shift || []; | ||
150 | my ($args, @values) = ({}, ()); | ||||
151 | my %pairs = map { ($_, 1) } @$paired_arguments; | ||||
152 | while (@_) { | ||||
153 | 84 | 75µs | my $elem = shift; | ||
154 | 40 | 23µs | if (defined $elem and defined $pairs{$elem} and @_) { | ||
155 | $args->{$elem} = shift; | ||||
156 | } | ||||
157 | else { | ||||
158 | push @values, $elem; | ||||
159 | } | ||||
160 | } | ||||
161 | return wantarray ? ($args, @values) : $args; | ||||
162 | 1 | 2µs | }; | ||
163 | |||||
164 | # spent 1.25ms (276µs+979µs) within YAML::Base::__ANON__[/usr/share/perl5/YAML/Base.pm:172] which was called 17 times, avg 74µs/call:
# 17 times (276µs+979µs) by YAML::Base::field at line 55, avg 74µs/call | ||||
165 | 3 | 119µs | 2 | 70µs | # spent 44µs (18+26) within YAML::Base::BEGIN@165 which was called:
# once (18µs+26µs) by YAML::BEGIN@6 at line 165 # spent 44µs making 1 call to YAML::Base::BEGIN@165
# spent 26µs making 1 call to warnings::unimport |
166 | 102 | 394µs | require Data::Dumper; | ||
167 | local $Data::Dumper::Sortkeys = 1; | ||||
168 | 17 | 869µs | my $code = Data::Dumper::Dumper(shift); # spent 869µs making 17 calls to Data::Dumper::Dumper, avg 51µs/call | ||
169 | 17 | 76µs | $code =~ s/^\$VAR1 = //; # spent 76µs making 17 calls to YAML::Base::CORE:subst, avg 4µs/call | ||
170 | 17 | 34µs | $code =~ s/;$//; # spent 34µs making 17 calls to YAML::Base::CORE:subst, avg 2µs/call | ||
171 | return $code; | ||||
172 | 1 | 2µs | }; | ||
173 | |||||
174 | 1 | 9µs | 1; | ||
175 | |||||
176 | __END__ | ||||
sub YAML::Base::CORE:subst; # opcode |