Filename | /home/ss5/perl5/perlbrew/perls/perl-5.14.1/lib/site_perl/5.14.1/x86_64-linux-thread-multi/Class/XSAccessor.pm |
Statements | Executed 277 statements in 6.81ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 1.70ms | 2.20ms | BEGIN@6 | Class::XSAccessor::
4 | 4 | 4 | 1.09ms | 2.66ms | import | Class::XSAccessor::
9 | 2 | 1 | 431µs | 1.33ms | _generate_method | Class::XSAccessor::
7 | 1 | 1 | 242µs | 242µs | newxs_accessor (xsub) | Class::XSAccessor::
24 | 6 | 1 | 241µs | 241µs | _make_hash | Class::XSAccessor::
1 | 1 | 1 | 75µs | 75µs | BEGIN@2 | Class::XSAccessor::
1 | 1 | 1 | 37µs | 89µs | BEGIN@80 | Class::XSAccessor::
9 | 1 | 1 | 33µs | 33µs | CORE:match (opcode) | Class::XSAccessor::
2 | 1 | 1 | 28µs | 28µs | newxs_constructor (xsub) | Class::XSAccessor::
1 | 1 | 1 | 28µs | 40µs | BEGIN@3 | Class::XSAccessor::
1 | 1 | 1 | 27µs | 132µs | BEGIN@5 | Class::XSAccessor::
1 | 1 | 1 | 27µs | 49µs | BEGIN@4 | Class::XSAccessor::
1 | 1 | 1 | 24µs | 24µs | BEGIN@7 | Class::XSAccessor::
1 | 1 | 1 | 8µs | 8µs | END (xsub) | Class::XSAccessor::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Class::XSAccessor; | ||||
2 | 2 | 177µs | 1 | 75µs | # spent 75µs within Class::XSAccessor::BEGIN@2 which was called:
# once (75µs+0s) by Class::XSAccessor::Array::BEGIN@6 at line 2 # spent 75µs making 1 call to Class::XSAccessor::BEGIN@2 |
3 | 2 | 88µs | 2 | 51µs | # spent 40µs (28+12) within Class::XSAccessor::BEGIN@3 which was called:
# once (28µs+12µs) by Class::XSAccessor::Array::BEGIN@6 at line 3 # spent 40µs making 1 call to Class::XSAccessor::BEGIN@3
# spent 12µs making 1 call to strict::import |
4 | 2 | 98µs | 2 | 71µs | # spent 49µs (27+22) within Class::XSAccessor::BEGIN@4 which was called:
# once (27µs+22µs) by Class::XSAccessor::Array::BEGIN@6 at line 4 # spent 49µs making 1 call to Class::XSAccessor::BEGIN@4
# spent 22µs making 1 call to warnings::import |
5 | 2 | 93µs | 2 | 237µs | # spent 132µs (27+105) within Class::XSAccessor::BEGIN@5 which was called:
# once (27µs+105µs) by Class::XSAccessor::Array::BEGIN@6 at line 5 # spent 132µs making 1 call to Class::XSAccessor::BEGIN@5
# spent 105µs making 1 call to Exporter::import |
6 | 2 | 397µs | 1 | 2.20ms | # spent 2.20ms (1.70+504µs) within Class::XSAccessor::BEGIN@6 which was called:
# once (1.70ms+504µs) by Class::XSAccessor::Array::BEGIN@6 at line 6 # spent 2.20ms making 1 call to Class::XSAccessor::BEGIN@6 |
7 | 2 | 1.79ms | 1 | 24µs | # spent 24µs within Class::XSAccessor::BEGIN@7 which was called:
# once (24µs+0s) by Class::XSAccessor::Array::BEGIN@6 at line 7 # spent 24µs making 1 call to Class::XSAccessor::BEGIN@7 |
8 | |||||
9 | 1 | 2µs | our $VERSION = '1.13'; | ||
10 | |||||
11 | 1 | 1.23ms | 1 | 1.18ms | XSLoader::load('Class::XSAccessor', $VERSION); # spent 1.18ms making 1 call to XSLoader::load |
12 | |||||
13 | # spent 241µs within Class::XSAccessor::_make_hash which was called 24 times, avg 10µs/call:
# 4 times (67µs+0s) by Class::XSAccessor::import at line 39, avg 17µs/call
# 4 times (56µs+0s) by Class::XSAccessor::import at line 37, avg 14µs/call
# 4 times (31µs+0s) by Class::XSAccessor::import at line 38, avg 8µs/call
# 4 times (31µs+0s) by Class::XSAccessor::import at line 40, avg 8µs/call
# 4 times (28µs+0s) by Class::XSAccessor::import at line 42, avg 7µs/call
# 4 times (28µs+0s) by Class::XSAccessor::import at line 41, avg 7µs/call | ||||
14 | 24 | 27µs | my $ref = shift; | ||
15 | |||||
16 | 24 | 83µs | if (ref ($ref)) { | ||
17 | if (ref($ref) eq 'ARRAY') { | ||||
18 | $ref = { map { $_ => $_ } @$ref } | ||||
19 | } | ||||
20 | } else { | ||||
21 | $ref = { $ref, $ref }; | ||||
22 | } | ||||
23 | |||||
24 | 24 | 293µs | return $ref; | ||
25 | } | ||||
26 | |||||
27 | # spent 2.66ms (1.09+1.57) within Class::XSAccessor::import which was called 4 times, avg 665µs/call:
# once (266µs+733µs) by Data::DPath::Point::BEGIN@14 at line 14 of Data/DPath/Point.pm
# once (305µs+379µs) by Data::DPath::Attrs::BEGIN@14 at line 14 of Data/DPath/Attrs.pm
# once (243µs+409µs) by Data::DPath::Path::BEGIN@20 at line 20 of Data/DPath/Path.pm
# once (274µs+50µs) by Class::XSAccessor::Array::BEGIN@6 at line 6 of Class/XSAccessor/Array.pm | ||||
28 | 4 | 8µs | my $own_class = shift; | ||
29 | 4 | 24µs | my ($caller_pkg) = caller(); | ||
30 | |||||
31 | # Support both { getters => ... } and plain getters => ... | ||||
32 | 4 | 40µs | my %opts = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_; | ||
33 | |||||
34 | 4 | 9µs | $caller_pkg = $opts{class} if defined $opts{class}; | ||
35 | |||||
36 | # TODO: Refactor. Move more duplicated code to ::Heavy | ||||
37 | 4 | 40µs | 4 | 56µs | my $read_subs = _make_hash($opts{getters} || {}); # spent 56µs making 4 calls to Class::XSAccessor::_make_hash, avg 14µs/call |
38 | 4 | 33µs | 4 | 31µs | my $set_subs = _make_hash($opts{setters} || {}); # spent 31µs making 4 calls to Class::XSAccessor::_make_hash, avg 8µs/call |
39 | 4 | 93µs | 4 | 67µs | my $acc_subs = _make_hash($opts{accessors} || {}); # spent 67µs making 4 calls to Class::XSAccessor::_make_hash, avg 17µs/call |
40 | 4 | 31µs | 4 | 31µs | my $lvacc_subs = _make_hash($opts{lvalue_accessors} || {}); # spent 31µs making 4 calls to Class::XSAccessor::_make_hash, avg 8µs/call |
41 | 4 | 29µs | 4 | 28µs | my $pred_subs = _make_hash($opts{predicates} || {}); # spent 28µs making 4 calls to Class::XSAccessor::_make_hash, avg 7µs/call |
42 | 4 | 28µs | 4 | 28µs | my $test_subs = _make_hash($opts{__tests__} || {}); # spent 28µs making 4 calls to Class::XSAccessor::_make_hash, avg 7µs/call |
43 | 4 | 22µs | my $construct_subs = $opts{constructors} || [defined($opts{constructor}) ? $opts{constructor} : ()]; | ||
44 | 4 | 9µs | my $true_subs = $opts{true} || []; | ||
45 | 4 | 7µs | my $false_subs = $opts{false} || []; | ||
46 | |||||
47 | 4 | 86µs | foreach my $subtype ( ["getter", $read_subs], | ||
48 | ["setter", $set_subs], | ||||
49 | ["accessor", $acc_subs], | ||||
50 | ["lvalue_accessor", $lvacc_subs], | ||||
51 | ["test", $test_subs], | ||||
52 | ["predicate", $pred_subs] ) | ||||
53 | { | ||||
54 | 24 | 40µs | my $subs = $subtype->[1]; | ||
55 | 24 | 161µs | foreach my $subname (keys %$subs) { | ||
56 | 7 | 17µs | my $hashkey = $subs->{$subname}; | ||
57 | 7 | 68µs | 7 | 1.14ms | _generate_method($caller_pkg, $subname, $hashkey, \%opts, $subtype->[0]); # spent 1.14ms making 7 calls to Class::XSAccessor::_generate_method, avg 162µs/call |
58 | } | ||||
59 | } | ||||
60 | |||||
61 | 4 | 136µs | foreach my $subtype ( ["constructor", $construct_subs], | ||
62 | ["true", $true_subs], | ||||
63 | ["false", $false_subs] ) | ||||
64 | { | ||||
65 | 12 | 43µs | foreach my $subname (@{$subtype->[1]}) { | ||
66 | 2 | 19µs | 2 | 194µs | _generate_method($caller_pkg, $subname, "", \%opts, $subtype->[0]); # spent 194µs making 2 calls to Class::XSAccessor::_generate_method, avg 97µs/call |
67 | } | ||||
68 | } | ||||
69 | } | ||||
70 | |||||
71 | sub _generate_method { | ||||
72 | 9 | 33µs | my ($caller_pkg, $subname, $hashkey, $opts, $type) = @_; | ||
73 | |||||
74 | 9 | 9µs | croak("Cannot use undef as a hash key for generating an XS $type accessor. (Sub: $subname)") | ||
75 | if not defined $hashkey; | ||||
76 | |||||
77 | 9 | 137µs | 9 | 33µs | $subname = "${caller_pkg}::$subname" if $subname !~ /::/; # spent 33µs making 9 calls to Class::XSAccessor::CORE:match, avg 4µs/call |
78 | |||||
79 | 9 | 57µs | 9 | 596µs | Class::XSAccessor::Heavy::check_sub_existence($subname) if not $opts->{replace}; # spent 596µs making 9 calls to Class::XSAccessor::Heavy::check_sub_existence, avg 66µs/call |
80 | 2 | 834µs | 2 | 141µs | # spent 89µs (37+52) within Class::XSAccessor::BEGIN@80 which was called:
# once (37µs+52µs) by Class::XSAccessor::Array::BEGIN@6 at line 80 # spent 89µs making 1 call to Class::XSAccessor::BEGIN@80
# spent 52µs making 1 call to warnings::unimport |
81 | |||||
82 | 9 | 156µs | 2 | 28µs | if ($type eq 'getter') { # spent 28µs making 2 calls to Class::XSAccessor::newxs_constructor, avg 14µs/call |
83 | newxs_getter($subname, $hashkey); | ||||
84 | } | ||||
85 | elsif ($type eq 'lvalue_accessor') { | ||||
86 | newxs_lvalue_accessor($subname, $hashkey); | ||||
87 | } | ||||
88 | elsif ($type eq 'setter') { | ||||
89 | newxs_setter($subname, $hashkey, $opts->{chained}||0); | ||||
90 | } | ||||
91 | elsif ($type eq 'predicate') { | ||||
92 | newxs_predicate($subname, $hashkey); | ||||
93 | } | ||||
94 | elsif ($type eq 'constructor') { | ||||
95 | newxs_constructor($subname); | ||||
96 | } | ||||
97 | elsif ($type eq 'true') { | ||||
98 | newxs_boolean($subname, 1); | ||||
99 | } | ||||
100 | elsif ($type eq 'false') { | ||||
101 | newxs_boolean($subname, 0); | ||||
102 | } | ||||
103 | elsif ($type eq 'test') { | ||||
104 | newxs_test($subname, $hashkey); | ||||
105 | } | ||||
106 | else { | ||||
107 | 7 | 333µs | 7 | 242µs | newxs_accessor($subname, $hashkey, $opts->{chained}||0); # spent 242µs making 7 calls to Class::XSAccessor::newxs_accessor, avg 35µs/call |
108 | } | ||||
109 | } | ||||
110 | |||||
111 | 1 | 21µs | 1; | ||
112 | |||||
113 | __END__ | ||||
# spent 33µs within Class::XSAccessor::CORE:match which was called 9 times, avg 4µs/call:
# 9 times (33µs+0s) by Class::XSAccessor::_generate_method at line 77, avg 4µs/call | |||||
# spent 8µs within Class::XSAccessor::END which was called:
# once (8µs+0s) by main::RUNTIME at line 0 of bin/dpath | |||||
# spent 242µs within Class::XSAccessor::newxs_accessor which was called 7 times, avg 35µs/call:
# 7 times (242µs+0s) by Class::XSAccessor::_generate_method at line 107, avg 35µs/call | |||||
# spent 28µs within Class::XSAccessor::newxs_constructor which was called 2 times, avg 14µs/call:
# 2 times (28µs+0s) by Class::XSAccessor::_generate_method at line 82, avg 14µs/call |