| Filename | /home/ss5/perl5/perlbrew/perls/tapper-perl/lib/site_perl/5.16.3/x86_64-linux/Class/XSAccessor/Array.pm |
| Statements | Executed 129 statements in 733µs |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 535µs | 1.24ms | Class::XSAccessor::Array::BEGIN@6 |
| 7 | 2 | 1 | 90µs | 212µs | Class::XSAccessor::Array::_generate_method |
| 2 | 2 | 2 | 87µs | 299µs | Class::XSAccessor::Array::import |
| 5 | 1 | 1 | 28µs | 28µs | Class::XSAccessor::Array::newxs_accessor (xsub) |
| 1 | 1 | 1 | 16µs | 16µs | Class::XSAccessor::Array::BEGIN@2 |
| 1 | 1 | 1 | 9µs | 17µs | Class::XSAccessor::Array::BEGIN@62 |
| 1 | 1 | 1 | 9µs | 46µs | Class::XSAccessor::Array::BEGIN@5 |
| 1 | 1 | 1 | 9µs | 18µs | Class::XSAccessor::Array::BEGIN@3 |
| 2 | 1 | 1 | 8µs | 8µs | Class::XSAccessor::Array::newxs_constructor (xsub) |
| 1 | 1 | 1 | 7µs | 10µs | Class::XSAccessor::Array::BEGIN@4 |
| 1 | 1 | 1 | 5µs | 5µs | Class::XSAccessor::Array::BEGIN@7 |
| 7 | 1 | 1 | 4µs | 4µs | Class::XSAccessor::Array::CORE:match (opcode) |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Class::XSAccessor::Array; | ||||
| 2 | 2 | 37µs | 1 | 16µs | # spent 16µs within Class::XSAccessor::Array::BEGIN@2 which was called:
# once (16µs+0s) by Data::DPath::Step::BEGIN@14 at line 2 # spent 16µs making 1 call to Class::XSAccessor::Array::BEGIN@2 |
| 3 | 2 | 20µs | 2 | 28µs | # spent 18µs (9+9) within Class::XSAccessor::Array::BEGIN@3 which was called:
# once (9µs+9µs) by Data::DPath::Step::BEGIN@14 at line 3 # spent 18µs making 1 call to Class::XSAccessor::Array::BEGIN@3
# spent 10µs making 1 call to strict::import |
| 4 | 2 | 20µs | 2 | 13µs | # spent 10µs (7+3) within Class::XSAccessor::Array::BEGIN@4 which was called:
# once (7µs+3µs) by Data::DPath::Step::BEGIN@14 at line 4 # spent 10µs making 1 call to Class::XSAccessor::Array::BEGIN@4
# spent 3µs making 1 call to warnings::import |
| 5 | 2 | 20µs | 2 | 83µs | # spent 46µs (9+37) within Class::XSAccessor::Array::BEGIN@5 which was called:
# once (9µs+37µs) by Data::DPath::Step::BEGIN@14 at line 5 # spent 46µs making 1 call to Class::XSAccessor::Array::BEGIN@5
# spent 37µs making 1 call to Exporter::import |
| 6 | 2 | 70µs | 2 | 1.28ms | # spent 1.24ms (535µs+706µs) within Class::XSAccessor::Array::BEGIN@6 which was called:
# once (535µs+706µs) by Data::DPath::Step::BEGIN@14 at line 6 # spent 1.24ms making 1 call to Class::XSAccessor::Array::BEGIN@6
# spent 41µs making 1 call to Class::XSAccessor::import |
| 7 | 2 | 258µs | 1 | 5µs | # spent 5µs within Class::XSAccessor::Array::BEGIN@7 which was called:
# once (5µs+0s) by Data::DPath::Step::BEGIN@14 at line 7 # spent 5µs making 1 call to Class::XSAccessor::Array::BEGIN@7 |
| 8 | |||||
| 9 | 1 | 400ns | our $VERSION = '1.14'; | ||
| 10 | |||||
| 11 | # spent 299µs (87+212) within Class::XSAccessor::Array::import which was called 2 times, avg 150µs/call:
# once (55µs+114µs) by Data::DPath::Context::BEGIN@57 at line 57 of Data/DPath/Context.pm
# once (32µs+98µs) by Data::DPath::Step::BEGIN@14 at line 14 of Data/DPath/Step.pm | ||||
| 12 | 2 | 1µs | my $own_class = shift; | ||
| 13 | 2 | 3µs | my ($caller_pkg) = caller(); | ||
| 14 | |||||
| 15 | # Support both { getters => ... } and plain getters => ... | ||||
| 16 | 2 | 5µs | my %opts = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_; | ||
| 17 | |||||
| 18 | 2 | 900ns | $caller_pkg = $opts{class} if defined $opts{class}; | ||
| 19 | |||||
| 20 | 2 | 2µs | my $read_subs = $opts{getters} || {}; | ||
| 21 | 2 | 800ns | my $set_subs = $opts{setters} || {}; | ||
| 22 | 2 | 900ns | my $acc_subs = $opts{accessors} || {}; | ||
| 23 | 2 | 800ns | my $lvacc_subs = $opts{lvalue_accessors} || {}; | ||
| 24 | 2 | 900ns | my $pred_subs = $opts{predicates} || {}; | ||
| 25 | 2 | 3µs | my $construct_subs = $opts{constructors} || [defined($opts{constructor}) ? $opts{constructor} : ()]; | ||
| 26 | 2 | 700ns | my $true_subs = $opts{true} || []; | ||
| 27 | 2 | 1µs | my $false_subs = $opts{false} || []; | ||
| 28 | |||||
| 29 | |||||
| 30 | 2 | 7µs | foreach my $subtype ( ["getter", $read_subs], | ||
| 31 | ["setter", $set_subs], | ||||
| 32 | ["accessor", $acc_subs], | ||||
| 33 | ["lvalue_accessor", $lvacc_subs], | ||||
| 34 | ["pred_subs", $pred_subs] ) | ||||
| 35 | { | ||||
| 36 | 10 | 3µs | my $subs = $subtype->[1]; | ||
| 37 | 10 | 15µs | foreach my $subname (keys %$subs) { | ||
| 38 | 5 | 2µs | my $array_index = $subs->{$subname}; | ||
| 39 | 5 | 12µs | 5 | 162µs | _generate_method($caller_pkg, $subname, $array_index, \%opts, $subtype->[0]); # spent 162µs making 5 calls to Class::XSAccessor::Array::_generate_method, avg 32µs/call |
| 40 | } | ||||
| 41 | } | ||||
| 42 | |||||
| 43 | 2 | 16µs | foreach my $subtype ( ["constructor", $construct_subs], | ||
| 44 | ["true", $true_subs], | ||||
| 45 | ["false", $false_subs] ) | ||||
| 46 | { | ||||
| 47 | 6 | 5µs | foreach my $subname (@{$subtype->[1]}) { | ||
| 48 | 2 | 5µs | 2 | 50µs | _generate_method($caller_pkg, $subname, "", \%opts, $subtype->[0]); # spent 50µs making 2 calls to Class::XSAccessor::Array::_generate_method, avg 25µs/call |
| 49 | } | ||||
| 50 | } | ||||
| 51 | } | ||||
| 52 | |||||
| 53 | sub _generate_method { | ||||
| 54 | 7 | 6µs | my ($caller_pkg, $subname, $array_index, $opts, $type) = @_; | ||
| 55 | |||||
| 56 | 7 | 1µs | croak("Cannot use undef as a array index for generating an XS $type accessor. (Sub: $subname)") | ||
| 57 | if not defined $array_index; | ||||
| 58 | |||||
| 59 | 7 | 28µs | 7 | 4µs | $subname = "${caller_pkg}::$subname" if $subname !~ /::/; # spent 4µs making 7 calls to Class::XSAccessor::Array::CORE:match, avg 629ns/call |
| 60 | |||||
| 61 | 7 | 11µs | 7 | 82µs | Class::XSAccessor::Heavy::check_sub_existence($subname) if not $opts->{replace}; # spent 82µs making 7 calls to Class::XSAccessor::Heavy::check_sub_existence, avg 12µs/call |
| 62 | 2 | 95µs | 2 | 25µs | # spent 17µs (9+8) within Class::XSAccessor::Array::BEGIN@62 which was called:
# once (9µs+8µs) by Data::DPath::Step::BEGIN@14 at line 62 # spent 17µs making 1 call to Class::XSAccessor::Array::BEGIN@62
# spent 8µs making 1 call to warnings::unimport |
| 63 | |||||
| 64 | 7 | 2µs | if ($type eq 'getter') { | ||
| 65 | newxs_getter($subname, $array_index); | ||||
| 66 | } | ||||
| 67 | 7 | 35µs | 2 | 8µs | if ($type eq 'lvalue_accessor') { # spent 8µs making 2 calls to Class::XSAccessor::Array::newxs_constructor, avg 4µs/call |
| 68 | newxs_lvalue_accessor($subname, $array_index); | ||||
| 69 | } | ||||
| 70 | elsif ($type eq 'setter') { | ||||
| 71 | newxs_setter($subname, $array_index, $opts->{chained}||0); | ||||
| 72 | } | ||||
| 73 | elsif ($type eq 'predicate') { | ||||
| 74 | newxs_predicate($subname, $array_index); | ||||
| 75 | } | ||||
| 76 | elsif ($type eq 'constructor') { | ||||
| 77 | newxs_constructor($subname); | ||||
| 78 | } | ||||
| 79 | elsif ($type eq 'true') { | ||||
| 80 | Class::XSAccessor::newxs_boolean($subname, 1); | ||||
| 81 | } | ||||
| 82 | elsif ($type eq 'false') { | ||||
| 83 | Class::XSAccessor::newxs_boolean($subname, 0); | ||||
| 84 | } | ||||
| 85 | else { | ||||
| 86 | 5 | 44µs | 5 | 28µs | newxs_accessor($subname, $array_index, $opts->{chained}||0); # spent 28µs making 5 calls to Class::XSAccessor::Array::newxs_accessor, avg 6µs/call |
| 87 | } | ||||
| 88 | } | ||||
| 89 | |||||
| 90 | 1 | 2µs | 1; | ||
| 91 | |||||
| 92 | __END__ | ||||
# spent 4µs within Class::XSAccessor::Array::CORE:match which was called 7 times, avg 629ns/call:
# 7 times (4µs+0s) by Class::XSAccessor::Array::_generate_method at line 59, avg 629ns/call | |||||
# spent 28µs within Class::XSAccessor::Array::newxs_accessor which was called 5 times, avg 6µs/call:
# 5 times (28µs+0s) by Class::XSAccessor::Array::_generate_method at line 86, avg 6µs/call | |||||
# spent 8µs within Class::XSAccessor::Array::newxs_constructor which was called 2 times, avg 4µs/call:
# 2 times (8µs+0s) by Class::XSAccessor::Array::_generate_method at line 67, avg 4µs/call |