Profile of Class/Accessor/Grouped.pm

← Index
NYTProf Performance Profile «block view•line view•sub view»
For xt/tapper-mcp-scheduler-with-db-longrun.t
Run on Tue May 22 17:18:39 2012
Reported on Tue May 22 17:22:59 2012

Filename | /2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm
Statements | Executed 346982 statements in 1.56s

Subroutines
Calls | P | F | Exclusive Time | Inclusive Time | Subroutine
--- | --- | --- | --- | --- | ---
85383 | 14 | 14 | 1.19s | 1.39s | Class::Accessor::Grouped::::get_inheritedClass::Accessor::Grouped::get_inherited
822 | 1 | 1 | 20.1ms | 24.1ms | Class::Accessor::Grouped::::__ANON__[:810]Class::Accessor::Grouped::__ANON__[:810]
359 | 1 | 1 | 9.73ms | 39.8ms | Class::Accessor::Grouped::::_mk_group_accessorsClass::Accessor::Grouped::_mk_group_accessors
359 | 21 | 13 | 2.29ms | 42.1ms | Class::Accessor::Grouped::::mk_group_accessorsClass::Accessor::Grouped::mk_group_accessors
822 | 1 | 1 | 2.25ms | 26.4ms | Class::Accessor::Grouped::::make_group_accessorClass::Accessor::Grouped::make_group_accessor
221 | 15 | 15 | 1.46ms | 1.67ms | Class::Accessor::Grouped::::set_inheritedClass::Accessor::Grouped::set_inherited
179 | 1 | 1 | 1.16ms | 1.27ms | Class::Accessor::Grouped::::__ANON__[:606]Class::Accessor::Grouped::__ANON__[:606]
1 | 1 | 1 | 667µs | 1.56ms | Class::Accessor::Grouped::::BEGIN@529Class::Accessor::Grouped::BEGIN@529
50 | 1 | 1 | 367µs | 451µs | Class::Accessor::Grouped::::get_super_pathsClass::Accessor::Grouped::get_super_paths
179 | 1 | 1 | 108µs | 108µs | Class::Accessor::Grouped::::CORE:substClass::Accessor::Grouped::CORE:subst (opcode)
1 | 1 | 1 | 12µs | 14µs | Class::Accessor::Grouped::::BEGIN@2Class::Accessor::Grouped::BEGIN@2
1 | 1 | 1 | 12µs | 28µs | Class::Accessor::Grouped::::BEGIN@744Class::Accessor::Grouped::BEGIN@744
1 | 1 | 1 | 8µs | 22µs | Class::Accessor::Grouped::::BEGIN@38Class::Accessor::Grouped::BEGIN@38
1 | 1 | 1 | 7µs | 15µs | Class::Accessor::Grouped::::BEGIN@250Class::Accessor::Grouped::BEGIN@250
1 | 1 | 1 | 7µs | 18µs | Class::Accessor::Grouped::::BEGIN@37Class::Accessor::Grouped::BEGIN@37
1 | 1 | 1 | 7µs | 16µs | Class::Accessor::Grouped::::BEGIN@249Class::Accessor::Grouped::BEGIN@249
1 | 1 | 1 | 7µs | 21µs | Class::Accessor::Grouped::::BEGIN@766Class::Accessor::Grouped::BEGIN@766
1 | 1 | 1 | 7µs | 15µs | Class::Accessor::Grouped::::BEGIN@793Class::Accessor::Grouped::BEGIN@793
1 | 1 | 1 | 7µs | 14µs | Class::Accessor::Grouped::::BEGIN@3Class::Accessor::Grouped::BEGIN@3
1 | 1 | 1 | 7µs | 14µs | Class::Accessor::Grouped::::BEGIN@765Class::Accessor::Grouped::BEGIN@765
1 | 1 | 1 | 7µs | 14µs | Class::Accessor::Grouped::::BEGIN@297Class::Accessor::Grouped::BEGIN@297
1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::::BEGIN@7Class::Accessor::Grouped::BEGIN@7
1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::::BEGIN@5Class::Accessor::Grouped::BEGIN@5
1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::::BEGIN@4Class::Accessor::Grouped::BEGIN@4
1 | 1 | 1 | 4µs | 4µs | Class::Accessor::Grouped::::BEGIN@21Class::Accessor::Grouped::BEGIN@21
1 | 1 | 1 | 2µs | 2µs | Class::Accessor::Grouped::::CORE:matchClass::Accessor::Grouped::CORE:match (opcode)
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::__ANON__[:543]Class::Accessor::Grouped::__ANON__[:543]
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::__ANON__[:559]Class::Accessor::Grouped::__ANON__[:559]
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::__ANON__[:625]Class::Accessor::Grouped::__ANON__[:625]
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::__ANON__[:644]Class::Accessor::Grouped::__ANON__[:644]
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::__ANON__[:782]Class::Accessor::Grouped::__ANON__[:782]
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::get_component_classClass::Accessor::Grouped::get_component_class
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::get_simpleClass::Accessor::Grouped::get_simple
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::make_group_ro_accessorClass::Accessor::Grouped::make_group_ro_accessor
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::make_group_wo_accessorClass::Accessor::Grouped::make_group_wo_accessor
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::mk_group_ro_accessorsClass::Accessor::Grouped::mk_group_ro_accessors
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::mk_group_wo_accessorsClass::Accessor::Grouped::mk_group_wo_accessors
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::set_component_classClass::Accessor::Grouped::set_component_class
0 | 0 | 0 | 0s | 0s | Class::Accessor::Grouped::::set_simpleClass::Accessor::Grouped::set_simple

Call graph for these subroutines as a Graphviz dot language file.

Line | State ments | Time on line | Calls | Time in subs | Code
--- | --- | --- | --- | --- | ---
1 |  |  |  |  | package Class::Accessor::Grouped;
2 | 3 | 18µs | 2 | 16µs | # spent 14µs (12+2) within Class::Accessor::Grouped::BEGIN@2 which was called: # once (12µs+2µs) by base::import at line 2 use strict; # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@2 # spent 2µs making 1 call to strict::import
3 | 3 | 17µs | 2 | 22µs | # spent 14µs (7+7) within Class::Accessor::Grouped::BEGIN@3 which was called: # once (7µs+7µs) by base::import at line 3 use warnings; # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@3 # spent 7µs making 1 call to warnings::import
4 | 3 | 16µs | 1 | 4µs | # spent 4µs within Class::Accessor::Grouped::BEGIN@4 which was called: # once (4µs+0s) by base::import at line 4 use Carp (); # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@4
5 | 3 | 35µs | 1 | 4µs | # spent 4µs within Class::Accessor::Grouped::BEGIN@5 which was called: # once (4µs+0s) by base::import at line 5 use Scalar::Util (); # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@5
6 |  |  |  |  |
7 |  |  |  |  | # spent 4µs within Class::Accessor::Grouped::BEGIN@7 which was called: # once (4µs+0s) by base::import at line 14 BEGIN {
8 | 2 | 6µs |  |  | if ($] < 5.009_005) {
9 |  |  |  |  | require MRO::Compat;
10 |  |  |  |  | }
11 |  |  |  |  | else {
12 |  |  |  |  | require mro;
13 |  |  |  |  | }
14 | 1 | 52µs | 1 | 4µs | } # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@7
15 |  |  |  |  |
16 | 1 | 1µs |  |  | our $VERSION = '0.10006';
17 | 1 | 8µs | 1 | 2µs | $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases # spent 2µs making 1 call to Class::Accessor::Grouped::CORE:match
18 |  |  |  |  |
19 |  |  |  |  | # when changing minimum version don't forget to adjust Makefile.PL as well
20 | 1 | 100ns |  |  | our $__minimum_xsa_version;
21 | 1 | 63µs | 1 | 4µs | # spent 4µs within Class::Accessor::Grouped::BEGIN@21 which was called: # once (4µs+0s) by base::import at line 21 BEGIN { $__minimum_xsa_version = '1.13' } # spent 4µs making 1 call to Class::Accessor::Grouped::BEGIN@21
22 |  |  |  |  |
23 | 1 | 200ns |  |  | our $USE_XS;
24 |  |  |  |  | # the unless defined is here so that we can override the value
25 |  |  |  |  | # before require/use, *regardless* of the state of $ENV{CAG_USE_XS}
26 | 1 | 1µs |  |  | $USE_XS = $ENV{CAG_USE_XS}
27 |  |  |  |  | unless defined $USE_XS;
28 |  |  |  |  |
29 |  |  |  |  | # Yes this method is undocumented
30 |  |  |  |  | # Yes it should be a private coderef like all the rest at the end of this file
31 |  |  |  |  | # No we can't do that (yet) because the DBIC-CDBI compat layer overrides it
32 |  |  |  |  | # %$*@!?&!&#*$!!!
33 |  |  |  |  | # spent 39.8ms (9.73+30.1) within Class::Accessor::Grouped::_mk_group_accessors which was called 359 times, avg 111µs/call: # 359 times (9.73ms+30.1ms) by Class::Accessor::Grouped::mk_group_accessors at line 125, avg 111µs/call sub _mk_group_accessors {
34 | 1436 | 4.40ms |  |  | my($self, $maker, $group, @fields) = @_;
35 |  |  | 359 | 201µs | my $class = Scalar::Util::blessed $self || $self; # spent 201µs making 359 calls to Scalar::Util::blessed, avg 560ns/call
36 |  |  |  |  |
37 | 3 | 19µs | 2 | 28µs | # spent 18µs (7+10) within Class::Accessor::Grouped::BEGIN@37 which was called: # once (7µs+10µs) by base::import at line 37 no strict 'refs'; # spent 18µs making 1 call to Class::Accessor::Grouped::BEGIN@37 # spent 10µs making 1 call to strict::unimport
38 | 3 | 362µs | 2 | 36µs | # spent 22µs (8+14) within Class::Accessor::Grouped::BEGIN@38 which was called: # once (8µs+14µs) by base::import at line 38 no warnings 'redefine'; # spent 22µs making 1 call to Class::Accessor::Grouped::BEGIN@38 # spent 14µs making 1 call to warnings::unimport
39 |  |  |  |  |
40 |  |  |  |  | # So we don't have to do lots of lookups inside the loop.
41 |  |  | 359 | 1.27ms | $maker = $self->can($maker) unless ref $maker; # spent 1.27ms making 359 calls to UNIVERSAL::can, avg 4µs/call
42 |  |  |  |  |
43 |  |  |  |  | foreach (@fields) {
44 | 1644 | 1.22ms |  |  | if( $_ eq 'DESTROY' ) {
45 |  |  |  |  | Carp::carp("Having a data accessor named DESTROY in ".
46 |  |  |  |  | "'$class' is unwise.");
47 |  |  |  |  | }
48 |  |  |  |  |
49 |  |  |  |  | my ($name, $field) = (ref $_)
50 |  |  |  |  | ? (@$_)
51 |  |  |  |  | : ($_, $_)
52 |  |  |  |  | ;
53 |  |  |  |  |
54 |  |  |  |  | my $alias = "_${name}_accessor";
55 |  |  |  |  |
56 |  |  |  |  | for my $meth ($name, $alias) {
57 |  |  |  |  |
58 |  |  |  |  | # the maker may elect to not return anything, meaning it already
59 |  |  |  |  | # installed the coderef for us (e.g. lack of Sub::Name)
60 | 2466 | 7.59ms | 822 | 26.4ms | my $cref = $self->$maker($group, $field, $meth) # spent 26.4ms making 822 calls to Class::Accessor::Grouped::make_group_accessor, avg 32µs/call
61 |  |  |  |  | or next;
62 |  |  |  |  |
63 |  |  |  |  | my $fq_meth = "${class}::${meth}";
64 |  |  |  |  |
65 |  |  | 822 | 2.27ms | *$fq_meth = Sub::Name::subname($fq_meth, $cref); # spent 2.27ms making 822 calls to Sub::Name::subname, avg 3µs/call
66 |  |  |  |  | #unless defined &{$class."\:\:$field"}
67 |  |  |  |  | }
68 |  |  |  |  | }
69 |  |  |  |  | };
70 |  |  |  |  |
71 |  |  |  |  | # coderef is setup at the end for clarity
72 | 1 | 200ns |  |  | my $gen_accessor;
73 |  |  |  |  |
74 |  |  |  |  | =head1 NAME
75 |  |  |  |  |
76 |  |  |  |  | Class::Accessor::Grouped - Lets you build groups of accessors
77 |  |  |  |  |
78 |  |  |  |  | =head1 SYNOPSIS
79 |  |  |  |  |
80 |  |  |  |  | use base 'Class::Accessor::Grouped';
81 |  |  |  |  |
82 |  |  |  |  | # make basic accessors for objects
83 |  |  |  |  | __PACKAGE__->mk_group_accessors(simple => qw(id name email));
84 |  |  |  |  |
85 |  |  |  |  | # make accessor that works for objects and classes
86 |  |  |  |  | __PACKAGE__->mk_group_accessors(inherited => 'awesome_level');
87 |  |  |  |  |
88 |  |  |  |  | =head1 DESCRIPTION
89 |  |  |  |  |
90 |  |  |  |  | This class lets you build groups of accessors that will call different
91 |  |  |  |  | getters and setters.
92 |  |  |  |  |
93 |  |  |  |  | =head1 METHODS
94 |  |  |  |  |
95 |  |  |  |  | =head2 mk_group_accessors
96 |  |  |  |  |
97 |  |  |  |  | __PACKAGE__->mk_group_accessors(simple => 'hair_length', [ hair_color => 'hc' ]);
98 |  |  |  |  |
99 |  |  |  |  | =over 4
100 |  |  |  |  |
101 |  |  |  |  | =item Arguments: $group, @fieldspec
102 |  |  |  |  |
103 |  |  |  |  | Returns: none
104 |  |  |  |  |
105 |  |  |  |  | =back
106 |  |  |  |  |
107 |  |  |  |  | Creates a set of accessors in a given group.
108 |  |  |  |  |
109 |  |  |  |  | $group is the name of the accessor group for the generated accessors; they
110 |  |  |  |  | will call get_$group($field) on get and set_$group($field, $value) on set.
111 |  |  |  |  |
112 |  |  |  |  | If you want to mimic Class::Accessor's mk_accessors $group has to be 'simple'
113 |  |  |  |  | to tell Class::Accessor::Grouped to use its own get_simple and set_simple
114 |  |  |  |  | methods.
115 |  |  |  |  |
116 |  |  |  |  | @fieldspec is a list of field/accessor names; if a fieldspec is a scalar
117 |  |  |  |  | this is used as both field and accessor name, if a listref it is expected to
118 |  |  |  |  | be of the form [ $accessor, $field ].
119 |  |  |  |  |
120 |  |  |  |  | =cut
121 |  |  |  |  |
122 |  |  |  |  | # spent 42.1ms (2.29+39.8) within Class::Accessor::Grouped::mk_group_accessors which was called 359 times, avg 117µs/call: # 250 times (1.00ms+25.1ms) by DBIx::Class::Row::register_column at line 1346 of DBIx/Class/Row.pm, avg 105µs/call # 53 times (929µs+5.86ms) by DBIx::Class::mk_classaccessor at line 82 of DBIx/Class.pm, avg 128µs/call # 38 times (150µs+2.94ms) by DBIx::Class::InflateColumn::inflate_column at line 89 of DBIx/Class/InflateColumn.pm, avg 81µs/call # once (5µs+605µs) by Class::C3::Componentised::ensure_class_loaded at line 68 of DBIx/Class/Storage/DBI.pm # once (5µs+590µs) by Class::C3::Componentised::ensure_class_loaded at line 69 of DBIx/Class/Storage/DBI.pm # once (19µs+556µs) by Class::C3::Componentised::ensure_class_loaded at line 18 of DBIx/Class/ResultSource.pm # once (7µs+523µs) by Class::C3::Componentised::ensure_class_loaded at line 33 of DBIx/Class/Storage/DBI.pm # once (16µs+447µs) by Class::C3::Componentised::ensure_class_loaded at line 22 of DBIx/Class/Storage/DBI.pm # once (18µs+378µs) by Class::C3::Componentised::ensure_class_loaded at line 11 of DBIx/Class/Storage/DBI/Cursor.pm # once (5µs+348µs) by Class::C3::Componentised::ensure_class_loaded at line 44 of DBIx/Class/Storage/DBI.pm # once (19µs+333µs) by base::import at line 21 of DBIx/Class/Storage.pm # once (5µs+284µs) by Class::C3::Componentised::ensure_class_loaded at line 25 of DBIx/Class/ResultSource.pm # once (5µs+271µs) by Class::C3::Componentised::ensure_class_loaded at line 26 of DBIx/Class/Storage/DBI.pm # once (18µs+215µs) by base::import at line 50 of DBIx/Class/SQLMaker.pm # once (14µs+210µs) by Class::C3::Componentised::ensure_class_loaded at line 10 of DBIx/Class/ResultSource/View.pm # once (4µs+207µs) by DBIx::Class::FilterColumn::filter_column at line 27 of DBIx/Class/FilterColumn.pm # once (16µs+195µs) by base::import at line 12 of DBIx/Class/ResultSourceProxy.pm # once (5µs+205µs) by base::import at line 22 of DBIx/Class/Storage.pm # once (14µs+190µs) by parent::import at line 73 of DBIx/Class.pm # once (15µs+183µs) by DBIx::Class::ResultSource::BEGIN@7 at line 17 of DBIx/Class/ResultSourceHandle.pm # once (16µs+157µs) by DBIx::Class::ResultSource::Table::BEGIN@6 at line 29 of DBIx/Class/ResultSet.pm sub mk_group_accessors {
123 | 1077 | 2.28ms |  |  | my ($self, $group, @fields) = @_;
124 |  |  |  |  |
125 |  |  | 359 | 39.8ms | $self->_mk_group_accessors('make_group_accessor', $group, @fields); # spent 39.8ms making 359 calls to Class::Accessor::Grouped::_mk_group_accessors, avg 111µs/call
126 |  |  |  |  | return;
127 |  |  |  |  | }
128 |  |  |  |  |
129 |  |  |  |  | =head2 mk_group_ro_accessors
130 |  |  |  |  |
131 |  |  |  |  | __PACKAGE__->mk_group_ro_accessors(simple => 'birthdate', [ social_security_number => 'ssn' ]);
132 |  |  |  |  |
133 |  |  |  |  | =over 4
134 |  |  |  |  |
135 |  |  |  |  | =item Arguments: $group, @fieldspec
136 |  |  |  |  |
137 |  |  |  |  | Returns: none
138 |  |  |  |  |
139 |  |  |  |  | =back
140 |  |  |  |  |
141 |  |  |  |  | Creates a set of read only accessors in a given group. Identical to
142 |  |  |  |  | L</mk_group_accessors> but accessors will throw an error if passed a value
143 |  |  |  |  | rather than setting the value.
144 |  |  |  |  |
145 |  |  |  |  | =cut
146 |  |  |  |  |
147 |  |  |  |  | sub mk_group_ro_accessors {
148 |  |  |  |  | my($self, $group, @fields) = @_;
149 |  |  |  |  |
150 |  |  |  |  | $self->_mk_group_accessors('make_group_ro_accessor', $group, @fields);
151 |  |  |  |  | }
152 |  |  |  |  |
153 |  |  |  |  | =head2 mk_group_wo_accessors
154 |  |  |  |  |
155 |  |  |  |  | __PACKAGE__->mk_group_wo_accessors(simple => 'lie', [ subject => 'subj' ]);
156 |  |  |  |  |
157 |  |  |  |  | =over 4
158 |  |  |  |  |
159 |  |  |  |  | =item Arguments: $group, @fieldspec
160 |  |  |  |  |
161 |  |  |  |  | Returns: none
162 |  |  |  |  |
163 |  |  |  |  | =back
164 |  |  |  |  |
165 |  |  |  |  | Creates a set of write only accessors in a given group. Identical to
166 |  |  |  |  | L</mk_group_accessors> but accessors will throw an error if not passed a
167 |  |  |  |  | value rather than getting the value.
168 |  |  |  |  |
169 |  |  |  |  | =cut
170 |  |  |  |  |
171 |  |  |  |  | sub mk_group_wo_accessors {
172 |  |  |  |  | my($self, $group, @fields) = @_;
173 |  |  |  |  |
174 |  |  |  |  | $self->_mk_group_accessors('make_group_wo_accessor', $group, @fields);
175 |  |  |  |  | }
176 |  |  |  |  |
177 |  |  |  |  | =head2 get_simple
178 |  |  |  |  |
179 |  |  |  |  | =over 4
180 |  |  |  |  |
181 |  |  |  |  | =item Arguments: $field
182 |  |  |  |  |
183 |  |  |  |  | Returns: $value
184 |  |  |  |  |
185 |  |  |  |  | =back
186 |  |  |  |  |
187 |  |  |  |  | Simple getter for hash-based objects which returns the value for the field
188 |  |  |  |  | name passed as an argument.
189 |  |  |  |  |
190 |  |  |  |  | =cut
191 |  |  |  |  |
192 |  |  |  |  | sub get_simple {
193 |  |  |  |  | return $_[0]->{$_[1]};
194 |  |  |  |  | }
195 |  |  |  |  |
196 |  |  |  |  | =head2 set_simple
197 |  |  |  |  |
198 |  |  |  |  | =over 4
199 |  |  |  |  |
200 |  |  |  |  | =item Arguments: $field, $new_value
201 |  |  |  |  |
202 |  |  |  |  | Returns: $new_value
203 |  |  |  |  |
204 |  |  |  |  | =back
205 |  |  |  |  |
206 |  |  |  |  | Simple setter for hash-based objects which sets and then returns the value
207 |  |  |  |  | for the field name passed as an argument.
208 |  |  |  |  |
209 |  |  |  |  | =cut
210 |  |  |  |  |
211 |  |  |  |  | sub set_simple {
212 |  |  |  |  | return $_[0]->{$_[1]} = $_[2];
213 |  |  |  |  | }
214 |  |  |  |  |
215 |  |  |  |  |
216 |  |  |  |  | =head2 get_inherited
217 |  |  |  |  |
218 |  |  |  |  | =over 4
219 |  |  |  |  |
220 |  |  |  |  | =item Arguments: $field
221 |  |  |  |  |
222 |  |  |  |  | Returns: $value
223 |  |  |  |  |
224 |  |  |  |  | =back
225 |  |  |  |  |
226 |  |  |  |  | Simple getter for Classes and hash-based objects which returns the value for
227 |  |  |  |  | the field name passed as an argument. This behaves much like
228 |  |  |  |  | L<Class::Data::Accessor> where the field can be set in a base class,
229 |  |  |  |  | inherited and changed in subclasses, and inherited and changed for object
230 |  |  |  |  | instances.
231 |  |  |  |  |
232 |  |  |  |  | =cut
233 |  |  |  |  |
234 |  |  |  |  | # spent 1.39s (1.19+196ms) within Class::Accessor::Grouped::get_inherited which was called 85383 times, avg 16µs/call: # 35102 times (325ms+64.2ms) by DBIx::Class::AccessorGroup::get_component_class at line 13 of DBIx/Class/AccessorGroup.pm, avg 11µs/call # 13801 times (279ms+33.9ms) by DBIx::Class::Version::Table::result_source_instance or DBIx::Class::Version::TableCompat::result_source_instance or Tapper::Schema::ReportsDB::Result::Contact::result_source_instance or Tapper::Schema::ReportsDB::Result::Notification::result_source_instance or Tapper::Schema::ReportsDB::Result::NotificationEvent::result_source_instance or Tapper::Schema::ReportsDB::Result::Report::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportComment::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportFile::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportSection::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportTopic::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupArbitrary::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrun::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrunStats::result_source_instance or Tapper::Schema::ReportsDB::Result::Suite::result_source_instance or Tapper::Schema::ReportsDB::Result::Tap::result_source_instance or Tapper::Schema::ReportsDB::Result::User::result_source_instance or Tapper::Schema::ReportsDB::Result::View010TestrunOverviewReports::result_source_instance or Tapper::Schema::ReportsDB::Result::View020TestrunOverview::result_source_instance or Tapper::Schema::TestrunDB::Result::Host::result_source_instance or Tapper::Schema::TestrunDB::Result::HostFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::Message::result_source_instance or Tapper::Schema::TestrunDB::Result::PrePrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Precondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Preconditiontype::result_source_instance or Tapper::Schema::TestrunDB::Result::Queue::result_source_instance or Tapper::Schema::TestrunDB::Result::QueueHost::result_source_instance or Tapper::Schema::TestrunDB::Result::Scenario::result_source_instance or Tapper::Schema::TestrunDB::Result::ScenarioElement::result_source_instance or Tapper::Schema::TestrunDB::Result::State::result_source_instance or Tapper::Schema::TestrunDB::Result::TestplanInstance::result_source_instance or Tapper::Schema::TestrunDB::Result::Testrun::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunPrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedHost::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunScheduling::result_source_instance or Tapper::Schema::TestrunDB::Result::Topic::result_source_instance or Tapper::Schema::TestrunDB::Result::User::result_source_instance at line 2 of (eval 300)[Class/Accessor/Grouped.pm:807], avg 23µs/call # 12983 times (104ms+24.4ms) by DBIx::Class::Schema::storage at line 2 of (eval 335)[Class/Accessor/Grouped.pm:807], avg 10µs/call # 7002 times (180ms+26.5ms) by DBIx::Class::Storage::DBI::get_use_dbms_capability at line 1040 of DBIx/Class/Storage/DBI.pm, avg 29µs/call # 6450 times (69.2ms+15.6ms) by DBIx::Class::Schema::source_registrations at line 2 of (eval 333)[Class/Accessor/Grouped.pm:807], avg 13µs/call # 5708 times (210ms+25.9ms) by DBIx::Class::Schema::default_resultset_attributes at line 2 of (eval 338)[Class/Accessor/Grouped.pm:807], avg 41µs/call # 4198 times (21.6ms+4.77ms) by DBIx::Class::Schema::class_mappings at line 2 of (eval 332)[Class/Accessor/Grouped.pm:807], avg 6µs/call # 40 times (720µs+95µs) by DBIx::Class::_skip_namespace_frames at line 2 of (eval 272)[Class/Accessor/Grouped.pm:807], avg 20µs/call # 37 times (2.71ms+414µs) by DBIx::Class::ResultSourceProxy::Table::table_class at line 2 of (eval 298)[Class/Accessor/Grouped.pm:807], avg 84µs/call # 37 times (646µs+114µs) by DBIx::Class::ResultSource::sqlt_deploy_callback at line 2 of (eval 297)[Class/Accessor/Grouped.pm:807], avg 21µs/call # 12 times (163µs+23µs) by DBIx::Class::Schema::storage_type at line 2 of (eval 334)[Class/Accessor/Grouped.pm:807], avg 16µs/call # 5 times (70µs+9µs) by DBIx::Class::Storage::DBI::sql_limit_dialect at line 2 of (eval 1391)[Class/Accessor/Grouped.pm:807], avg 16µs/call # 4 times (191µs+21µs) by DBIx::Class::Schema::exception_action at line 2 of (eval 336)[Class/Accessor/Grouped.pm:807], avg 53µs/call # 4 times (81µs+13µs) by DBIx::Class::Schema::stacktrace at line 2 of (eval 337)[Class/Accessor/Grouped.pm:807], avg 24µs/call sub get_inherited {
235 | 286751 | 1.31s |  |  | my $class;
236 |  |  |  |  |
237 | 2800 | 2.17ms | 167966 | 150ms | if ( defined( $class = Scalar::Util::blessed $_[0] ) ) { # spent 85.3ms making 85383 calls to Scalar::Util::blessed, avg 999ns/call # spent 64.9ms making 82583 calls to Scalar::Util::reftype, avg 786ns/call
238 |  |  |  |  | if (Scalar::Util::reftype $_[0] eq 'HASH') {
239 |  |  |  |  | return $_[0]->{$_[1]} if exists $_[0]->{$_[1]};
240 |  |  |  |  | }
241 |  |  |  |  | else {
242 |  |  |  |  | Carp::croak('Cannot get inherited value on an object instance that is not hash-based');
243 |  |  |  |  | }
244 |  |  |  |  | }
245 |  |  |  |  | else {
246 |  |  |  |  | $class = $_[0];
247 |  |  |  |  | }
248 |  |  |  |  |
249 | 3 | 19µs | 2 | 24µs | # spent 16µs (7+8) within Class::Accessor::Grouped::BEGIN@249 which was called: # once (7µs+8µs) by base::import at line 249 no strict 'refs'; # spent 16µs making 1 call to Class::Accessor::Grouped::BEGIN@249 # spent 8µs making 1 call to strict::unimport
250 | 3 | 171µs | 2 | 24µs | # spent 15µs (7+8) within Class::Accessor::Grouped::BEGIN@250 which was called: # once (7µs+8µs) by base::import at line 250 no warnings 'uninitialized'; # spent 15µs making 1 call to Class::Accessor::Grouped::BEGIN@250 # spent 8µs making 1 call to warnings::unimport
251 |  |  |  |  |
252 |  |  |  |  | my $cag_slot = '::__cag_'. $_[1];
253 |  |  |  |  | return ${$class.$cag_slot} if defined(${$class.$cag_slot});
254 |  |  |  |  |
255 |  |  |  |  | # we need to be smarter about recalculation, as @ISA (thus supers) can very well change in-flight
256 |  |  | 17553 | 45.3ms | my $cur_gen = mro::get_pkg_gen ($class); # spent 45.3ms making 17553 calls to mro::get_pkg_gen, avg 3µs/call
257 | 100 | 1.40ms |  |  | if ( $cur_gen != ${$class.'::__cag_pkg_gen__'} ) {
258 |  |  | 50 | 451µs | @{$class.'::__cag_supers__'} = $_[0]->get_super_paths; # spent 451µs making 50 calls to Class::Accessor::Grouped::get_super_paths, avg 9µs/call
259 |  |  |  |  | ${$class.'::__cag_pkg_gen__'} = $cur_gen;
260 |  |  |  |  | }
261 |  |  |  |  |
262 |  |  |  |  | for (@{$class.'::__cag_supers__'}) {
263 | 43553 | 204ms |  |  | return ${$_.$cag_slot} if defined(${$_.$cag_slot});
264 |  |  |  |  | };
265 |  |  |  |  |
266 |  |  |  |  | return undef;
267 |  |  |  |  | }
268 |  |  |  |  |
269 |  |  |  |  | =head2 set_inherited
270 |  |  |  |  |
271 |  |  |  |  | =over 4
272 |  |  |  |  |
273 |  |  |  |  | =item Arguments: $field, $new_value
274 |  |  |  |  |
275 |  |  |  |  | Returns: $new_value
276 |  |  |  |  |
277 |  |  |  |  | =back
278 |  |  |  |  |
279 |  |  |  |  | Simple setter for Classes and hash-based objects which sets and then returns
280 |  |  |  |  | the value for the field name passed as an argument. When called on a hash-based
281 |  |  |  |  | object it will set the appropriate hash key value. When called on a class, it
282 |  |  |  |  | will set a class level variable.
283 |  |  |  |  |
284 |  |  |  |  | B<Note:>: This method will die if you try to set an object variable on a non
285 |  |  |  |  | hash-based object.
286 |  |  |  |  |
287 |  |  |  |  | =cut
288 |  |  |  |  |
289 |  |  |  |  | # spent 1.67ms (1.46+209µs) within Class::Accessor::Grouped::set_inherited which was called 221 times, avg 8µs/call: # 100 times (625µs+125µs) by DBIx::Class::Schema::source_registrations at line 2 of (eval 333)[Class/Accessor/Grouped.pm:807], avg 7µs/call # 43 times (213µs+31µs) by DBIx::Class::Schema::class_mappings at line 2 of (eval 332)[Class/Accessor/Grouped.pm:807], avg 6µs/call # 37 times (317µs+18µs) by DBIx::Class::Version::Table::result_source_instance or DBIx::Class::Version::TableCompat::result_source_instance or Tapper::Schema::ReportsDB::Result::Contact::result_source_instance or Tapper::Schema::ReportsDB::Result::Notification::result_source_instance or Tapper::Schema::ReportsDB::Result::NotificationEvent::result_source_instance or Tapper::Schema::ReportsDB::Result::Report::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportComment::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportFile::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportSection::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportTopic::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupArbitrary::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrun::result_source_instance or Tapper::Schema::ReportsDB::Result::ReportgroupTestrunStats::result_source_instance or Tapper::Schema::ReportsDB::Result::Suite::result_source_instance or Tapper::Schema::ReportsDB::Result::Tap::result_source_instance or Tapper::Schema::ReportsDB::Result::User::result_source_instance or Tapper::Schema::ReportsDB::Result::View010TestrunOverviewReports::result_source_instance or Tapper::Schema::ReportsDB::Result::View020TestrunOverview::result_source_instance or Tapper::Schema::TestrunDB::Result::Host::result_source_instance or Tapper::Schema::TestrunDB::Result::HostFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::Message::result_source_instance or Tapper::Schema::TestrunDB::Result::PrePrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Precondition::result_source_instance or Tapper::Schema::TestrunDB::Result::Preconditiontype::result_source_instance or Tapper::Schema::TestrunDB::Result::Queue::result_source_instance or Tapper::Schema::TestrunDB::Result::QueueHost::result_source_instance or Tapper::Schema::TestrunDB::Result::Scenario::result_source_instance or Tapper::Schema::TestrunDB::Result::ScenarioElement::result_source_instance or Tapper::Schema::TestrunDB::Result::State::result_source_instance or Tapper::Schema::TestrunDB::Result::TestplanInstance::result_source_instance or Tapper::Schema::TestrunDB::Result::Testrun::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunPrecondition::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedFeature::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunRequestedHost::result_source_instance or Tapper::Schema::TestrunDB::Result::TestrunScheduling::result_source_instance or Tapper::Schema::TestrunDB::Result::Topic::result_source_instance or Tapper::Schema::TestrunDB::Result::User::result_source_instance at line 2 of (eval 300)[Class/Accessor/Grouped.pm:807], avg 9µs/call # 12 times (98µs+14µs) by DBIx::Class::AccessorGroup::set_component_class at line 29 of DBIx/Class/AccessorGroup.pm, avg 9µs/call # 8 times (62µs+3µs) by DBIx::Class::mk_classaccessor at line 83 of DBIx/Class.pm, avg 8µs/call # 6 times (33µs+8µs) by DBIx::Class::Schema::storage at line 2 of (eval 335)[Class/Accessor/Grouped.pm:807], avg 7µs/call # 4 times (31µs+2µs) by DBIx::Class::DynamicDefault::__column_dynamic_default_triggers at line 2 of (eval 1304)[Class/Accessor/Grouped.pm:807], avg 8µs/call # 2 times (20µs+2µs) by DBIx::Class::ResultSourceProxy::Table::table_class at line 2 of (eval 298)[Class/Accessor/Grouped.pm:807], avg 11µs/call # 2 times (15µs+2µs) by DBIx::Class::Schema::Versioned::upgrade_directory at line 2 of (eval 349)[Class/Accessor/Grouped.pm:807], avg 8µs/call # 2 times (10µs+900ns) by DBIx::Class::Schema::Versioned::backup_directory at line 2 of (eval 350)[Class/Accessor/Grouped.pm:807], avg 5µs/call # once (13µs+600ns) by DBIx::Class::_skip_namespace_frames at line 2 of (eval 272)[Class/Accessor/Grouped.pm:807] # once (7µs+500ns) by DBIx::Class::Storage::DBI::set_use_dbms_capability at line 1034 of DBIx/Class/Storage/DBI.pm # once (5µs+400ns) by DBIx::Class::Storage::DBI::sql_limit_dialect at line 2 of (eval 1391)[Class/Accessor/Grouped.pm:807] # once (5µs+400ns) by DBIx::Class::Storage::DBI::sql_name_sep at line 2 of (eval 1393)[Class/Accessor/Grouped.pm:807] # once (5µs+400ns) by DBIx::Class::Storage::DBI::sql_quote_char at line 2 of (eval 1392)[Class/Accessor/Grouped.pm:807] sub set_inherited {
290 | 361 | 1.97ms | 302 | 209µs | if (defined Scalar::Util::blessed $_[0]) { # spent 144µs making 221 calls to Scalar::Util::blessed, avg 650ns/call # spent 65µs making 81 calls to Scalar::Util::reftype, avg 807ns/call
291 |  |  |  |  | if (Scalar::Util::reftype $_[0] eq 'HASH') {
292 |  |  |  |  | return $_[0]->{$_[1]} = $_[2];
293 |  |  |  |  | } else {
294 |  |  |  |  | Carp::croak('Cannot set inherited value on an object instance that is not hash-based');
295 |  |  |  |  | };
296 |  |  |  |  | } else {
297 | 3 | 526µs | 2 | 22µs | # spent 14µs (7+7) within Class::Accessor::Grouped::BEGIN@297 which was called: # once (7µs+7µs) by base::import at line 297 no strict 'refs'; # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@297 # spent 7µs making 1 call to strict::unimport
298 |  |  |  |  |
299 |  |  |  |  | return ${$_[0].'::__cag_'.$_[1]} = $_[2];
300 |  |  |  |  | };
301 |  |  |  |  | }
302 |  |  |  |  |
303 |  |  |  |  | =head2 get_component_class
304 |  |  |  |  |
305 |  |  |  |  | =over 4
306 |  |  |  |  |
307 |  |  |  |  | =item Arguments: $field
308 |  |  |  |  |
309 |  |  |  |  | Returns: $value
310 |  |  |  |  |
311 |  |  |  |  | =back
312 |  |  |  |  |
313 |  |  |  |  | Gets the value of the specified component class.
314 |  |  |  |  |
315 |  |  |  |  | __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
316 |  |  |  |  |
317 |  |  |  |  | $self->result_class->method();
318 |  |  |  |  |
319 |  |  |  |  | ## same as
320 |  |  |  |  | $self->get_component_class('result_class')->method();
321 |  |  |  |  |
322 |  |  |  |  | =cut
323 |  |  |  |  |
324 |  |  |  |  | sub get_component_class {
325 |  |  |  |  | return $_[0]->get_inherited($_[1]);
326 |  |  |  |  | };
327 |  |  |  |  |
328 |  |  |  |  | =head2 set_component_class
329 |  |  |  |  |
330 |  |  |  |  | =over 4
331 |  |  |  |  |
332 |  |  |  |  | =item Arguments: $field, $class
333 |  |  |  |  |
334 |  |  |  |  | Returns: $new_value
335 |  |  |  |  |
336 |  |  |  |  | =back
337 |  |  |  |  |
338 |  |  |  |  | Inherited accessor that automatically loads the specified class before setting
339 |  |  |  |  | it. This method will die if the specified class could not be loaded.
340 |  |  |  |  |
341 |  |  |  |  | __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
342 |  |  |  |  | __PACKAGE__->result_class('MyClass');
343 |  |  |  |  |
344 |  |  |  |  | $self->result_class->method();
345 |  |  |  |  |
346 |  |  |  |  | =cut
347 |  |  |  |  |
348 |  |  |  |  | sub set_component_class {
349 |  |  |  |  | if ($_[2]) {
350 |  |  |  |  | local $^W = 0;
351 |  |  |  |  | require Class::Inspector;
352 |  |  |  |  | if (Class::Inspector->installed($_[2]) && !Class::Inspector->loaded($_[2])) {
353 |  |  |  |  | eval "require $_[2]";
354 |  |  |  |  |
355 |  |  |  |  | Carp::croak("Could not load $_[1] '$_[2]': ", $@) if $@;
356 |  |  |  |  | };
357 |  |  |  |  | };
358 |  |  |  |  |
359 |  |  |  |  | return $_[0]->set_inherited($_[1], $_[2]);
360 |  |  |  |  | };
361 |  |  |  |  |
362 |  |  |  |  | =head1 INTERNAL METHODS
363 |  |  |  |  |
364 |  |  |  |  | These methods are documented for clarity, but are never meant to be called
365 |  |  |  |  | directly, and are not really meant for overriding either.
366 |  |  |  |  |
367 |  |  |  |  | =head2 get_super_paths
368 |  |  |  |  |
369 |  |  |  |  | Returns a list of 'parent' or 'super' class names that the current class
370 |  |  |  |  | inherited from. This is what drives the traversal done by L</get_inherited>.
371 |  |  |  |  |
372 |  |  |  |  | =cut
373 |  |  |  |  |
374 |  |  |  |  | # spent 451µs (367+84) within Class::Accessor::Grouped::get_super_paths which was called 50 times, avg 9µs/call: # 50 times (367µs+84µs) by Class::Accessor::Grouped::get_inherited at line 258, avg 9µs/call sub get_super_paths {
375 | 50 | 493µs | 50 | 84µs | return @{mro::get_linear_isa( ref($_[0]) || $_[0] )}; # spent 84µs making 50 calls to mro::get_linear_isa, avg 2µs/call
376 |  |  |  |  | };
377 |  |  |  |  |
378 |  |  |  |  | =head2 make_group_accessor
379 |  |  |  |  |
380 |  |  |  |  | __PACKAGE__->make_group_accessor('simple', 'hair_length', 'hair_length');
381 |  |  |  |  | __PACKAGE__->make_group_accessor('simple', 'hc', 'hair_color');
382 |  |  |  |  |
383 |  |  |  |  | =over 4
384 |  |  |  |  |
385 |  |  |  |  | =item Arguments: $group, $field, $accessor
386 |  |  |  |  |
387 |  |  |  |  | Returns: \&accessor_coderef ?
388 |  |  |  |  |
389 |  |  |  |  | =back
390 |  |  |  |  |
391 |  |  |  |  | Called by mk_group_accessors for each entry in @fieldspec. Either returns
392 |  |  |  |  | a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns
393 |  |  |  |  | C<undef> if it elects to install the coderef on its own.
394 |  |  |  |  |
395 |  |  |  |  | =cut
396 |  |  |  |  |
397 | 822 | 2.06ms | 822 | 24.1ms | # spent 26.4ms (2.25+24.1) within Class::Accessor::Grouped::make_group_accessor which was called 822 times, avg 32µs/call: # 822 times (2.25ms+24.1ms) by Class::Accessor::Grouped::_mk_group_accessors at line 60, avg 32µs/call sub make_group_accessor { $gen_accessor->('rw', @_) } # spent 24.1ms making 822 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:810], avg 29µs/call
398 |  |  |  |  |
399 |  |  |  |  | =head2 make_group_ro_accessor
400 |  |  |  |  |
401 |  |  |  |  | __PACKAGE__->make_group_ro_accessor('simple', 'birthdate', 'birthdate');
402 |  |  |  |  | __PACKAGE__->make_group_ro_accessor('simple', 'ssn', 'social_security_number');
403 |  |  |  |  |
404 |  |  |  |  | =over 4
405 |  |  |  |  |
406 |  |  |  |  | =item Arguments: $group, $field, $accessor
407 |  |  |  |  |
408 |  |  |  |  | Returns: \&accessor_coderef ?
409 |  |  |  |  |
410 |  |  |  |  | =back
411 |  |  |  |  |
412 |  |  |  |  | Called by mk_group_ro_accessors for each entry in @fieldspec. Either returns
413 |  |  |  |  | a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns
414 |  |  |  |  | C<undef> if it elects to install the coderef on its own.
415 |  |  |  |  |
416 |  |  |  |  | =cut
417 |  |  |  |  |
418 |  |  |  |  | sub make_group_ro_accessor { $gen_accessor->('ro', @_) }
419 |  |  |  |  |
420 |  |  |  |  | =head2 make_group_wo_accessor
421 |  |  |  |  |
422 |  |  |  |  | __PACKAGE__->make_group_wo_accessor('simple', 'lie', 'lie');
423 |  |  |  |  | __PACKAGE__->make_group_wo_accessor('simple', 'subj', 'subject');
424 |  |  |  |  |
425 |  |  |  |  | =over 4
426 |  |  |  |  |
427 |  |  |  |  | =item Arguments: $group, $field, $accessor
428 |  |  |  |  |
429 |  |  |  |  | Returns: \&accessor_coderef ?
430 |  |  |  |  |
431 |  |  |  |  | =back
432 |  |  |  |  |
433 |  |  |  |  | Called by mk_group_wo_accessors for each entry in @fieldspec. Either returns
434 |  |  |  |  | a coderef which will be installed at C<&__PACKAGE__::$accessor>, or returns
435 |  |  |  |  | C<undef> if it elects to install the coderef on its own.
436 |  |  |  |  |
437 |  |  |  |  | =cut
438 |  |  |  |  |
439 |  |  |  |  | sub make_group_wo_accessor { $gen_accessor->('wo', @_) }
440 |  |  |  |  |
441 |  |  |  |  |
442 |  |  |  |  | =head1 PERFORMANCE
443 |  |  |  |  |
444 |  |  |  |  | To provide total flexibility L<Class::Accessor::Grouped> calls methods
445 |  |  |  |  | internally while performing get/set actions, which makes it noticeably
446 |  |  |  |  | slower than similar modules. To compensate, this module will automatically
447 |  |  |  |  | use the insanely fast L<Class::XSAccessor> to generate the C<simple>-group
448 |  |  |  |  | accessors if this module is available on your system.
449 |  |  |  |  |
450 |  |  |  |  | =head2 Benchmark
451 |  |  |  |  |
452 |  |  |  |  | This is the result of a set/get/set loop benchmark on perl 5.12.1 with
453 |  |  |  |  | thread support, showcasing most popular accessor builders: L<Moose>, L<Mouse>,
454 |  |  |  |  | L<Moo>, L<CAF|Class::Accessor::Fast>, L<CAF_XS|Class::Accessor::Fast::XS>,
455 |  |  |  |  | L<XSA|Class::XSAccessor>, and L<CAF_XSA|Class::XSAccessor::Compat>:
456 |  |  |  |  |
457 |  |  |  |  | Rate CAG moOse CAF moUse moo HANDMADE CAF_XS moUse_XS moo_XS CAF_XSA XSA CAG_XS
458 |  |  |  |  | CAG 169/s -- -21% -24% -32% -32% -34% -59% -63% -67% -67% -67% -67%
459 |  |  |  |  | moOse 215/s 27% -- -3% -13% -13% -15% -48% -53% -58% -58% -58% -58%
460 |  |  |  |  | CAF 222/s 31% 3% -- -10% -10% -13% -46% -52% -57% -57% -57% -57%
461 |  |  |  |  | moUse 248/s 46% 15% 11% -- -0% -3% -40% -46% -52% -52% -52% -52%
462 |  |  |  |  | moo 248/s 46% 15% 11% 0% -- -3% -40% -46% -52% -52% -52% -52%
463 |  |  |  |  | HANDMADE 255/s 50% 18% 14% 3% 3% -- -38% -45% -50% -51% -51% -51%
464 |  |  |  |  | CAF_XS 411/s 143% 91% 85% 66% 66% 61% -- -11% -20% -20% -21% -21%
465 |  |  |  |  | moUse_XS 461/s 172% 114% 107% 86% 86% 81% 12% -- -10% -11% -11% -11%
466 |  |  |  |  | moo_XS 514/s 204% 139% 131% 107% 107% 102% 25% 12% -- -0% -1% -1%
467 |  |  |  |  | CAF_XSA 516/s 205% 140% 132% 108% 108% 103% 26% 12% 0% -- -0% -0%
468 |  |  |  |  | XSA 519/s 206% 141% 133% 109% 109% 104% 26% 13% 1% 0% -- -0%
469 |  |  |  |  | CAG_XS 519/s 206% 141% 133% 109% 109% 104% 26% 13% 1% 0% 0% --
470 |  |  |  |  |
471 |  |  |  |  | Benchmark program is available in the root of the
472 |  |  |  |  | L<repository|http://search.cpan.org/dist/Class-Accessor-Grouped/>:
473 |  |  |  |  |
474 |  |  |  |  | =head2 Notes on Class::XSAccessor
475 |  |  |  |  |
476 |  |  |  |  | You can force (or disable) the use of L<Class::XSAccessor> before creating a
477 |  |  |  |  | particular C<simple> accessor by either manipulating the global variable
478 |  |  |  |  | C<$Class::Accessor::Grouped::USE_XS> to true or false (preferably with
479 |  |  |  |  | L<localization|perlfunc/local>, or you can do so before runtime via the
480 |  |  |  |  | C<CAG_USE_XS> environment variable.
481 |  |  |  |  |
482 |  |  |  |  | Since L<Class::XSAccessor> has no knowledge of L</get_simple> and
483 |  |  |  |  | L</set_simple> this module does its best to detect if you are overriding
484 |  |  |  |  | one of these methods and will fall back to using the perl version of the
485 |  |  |  |  | accessor in order to maintain consistency. However be aware that if you
486 |  |  |  |  | enable use of C<Class::XSAccessor> (automatically or explicitly), create
487 |  |  |  |  | an object, invoke a simple accessor on that object, and B<then> manipulate
488 |  |  |  |  | the symbol table to install a C<get/set_simple> override - you get to keep
489 |  |  |  |  | all the pieces.
490 |  |  |  |  |
491 |  |  |  |  | =head1 AUTHORS
492 |  |  |  |  |
493 |  |  |  |  | Matt S. Trout <mst@shadowcatsystems.co.uk>
494 |  |  |  |  |
495 |  |  |  |  | Christopher H. Laco <claco@chrislaco.com>
496 |  |  |  |  |
497 |  |  |  |  | =head1 CONTRIBUTORS
498 |  |  |  |  |
499 |  |  |  |  | Caelum: Rafael Kitover <rkitover@cpan.org>
500 |  |  |  |  |
501 |  |  |  |  | frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
502 |  |  |  |  |
503 |  |  |  |  | groditi: Guillermo Roditi <groditi@cpan.org>
504 |  |  |  |  |
505 |  |  |  |  | Jason Plum <jason.plum@bmmsi.com>
506 |  |  |  |  |
507 |  |  |  |  | ribasushi: Peter Rabbitson <ribasushi@cpan.org>
508 |  |  |  |  |
509 |  |  |  |  |
510 |  |  |  |  | =head1 COPYRIGHT & LICENSE
511 |  |  |  |  |
512 |  |  |  |  | Copyright (c) 2006-2010 Matt S. Trout <mst@shadowcatsystems.co.uk>
513 |  |  |  |  |
514 |  |  |  |  | This program is free software; you can redistribute it and/or modify
515 |  |  |  |  | it under the same terms as perl itself.
516 |  |  |  |  |
517 |  |  |  |  | =cut
518 |  |  |  |  |
519 |  |  |  |  | ########################################################################
520 |  |  |  |  | ########################################################################
521 |  |  |  |  | ########################################################################
522 |  |  |  |  | #
523 |  |  |  |  | # Here be many angry dragons
524 |  |  |  |  | # (all code is in private coderefs since everything inherits CAG)
525 |  |  |  |  | #
526 |  |  |  |  | ########################################################################
527 |  |  |  |  | ########################################################################
528 |  |  |  |  |
529 |  |  |  |  | # spent 1.56ms (667µs+891µs) within Class::Accessor::Grouped::BEGIN@529 which was called: # once (667µs+891µs) by base::import at line 583 BEGIN {
530 |  |  |  |  |
531 | 10 | 20µs |  |  | die "Huh?! No minimum C::XSA version?!\n"
532 |  |  |  |  | unless $__minimum_xsa_version;
533 |  |  |  |  |
534 |  |  |  |  | local $@;
535 |  |  |  |  | my $err;
536 |  |  |  |  |
537 |  |  |  |  |
538 | 2 | 2µs |  |  | $err = eval { require Sub::Name; 1; } ? undef : do {
539 |  |  |  |  | delete $INC{'Sub/Name.pm'}; # because older perls suck
540 |  |  |  |  | $@;
541 |  |  |  |  | };
542 |  |  |  |  | *__CAG_ENV__::NO_SUBNAME = $err
543 |  |  |  |  | ? sub () { $err }
544 |  |  |  |  | : sub () { 0 }
545 |  |  |  |  | ;
546 |  |  |  |  |
547 |  |  |  |  |
548 |  |  |  |  | $err = eval {
549 |  |  |  |  | require Class::XSAccessor;
550 |  |  | 1 | 8µs | Class::XSAccessor->VERSION($__minimum_xsa_version); # spent 8µs making 1 call to UNIVERSAL::VERSION
551 |  |  |  |  | require Sub::Name;
552 |  |  |  |  | 1;
553 | 4 | 90µs |  |  | } ? undef : do {
554 |  |  |  |  | delete $INC{'Sub/Name.pm'}; # because older perls suck
555 |  |  |  |  | delete $INC{'Class/XSAccessor.pm'};
556 |  |  |  |  | $@;
557 |  |  |  |  | };
558 |  |  |  |  | *__CAG_ENV__::NO_CXSA = $err
559 |  |  |  |  | ? sub () { $err }
560 |  |  |  |  | : sub () { 0 }
561 |  |  |  |  | ;
562 |  |  |  |  |
563 |  |  |  |  |
564 |  |  |  |  | *__CAG_ENV__::BROKEN_GOTO = ($] < '5.008009')
565 |  |  |  |  | ? sub () { 1 }
566 |  |  |  |  | : sub () { 0 }
567 |  |  |  |  | ;
568 |  |  |  |  |
569 |  |  |  |  |
570 |  |  |  |  | *__CAG_ENV__::UNSTABLE_DOLLARAT = ($] < '5.013002')
571 |  |  |  |  | ? sub () { 1 }
572 |  |  |  |  | : sub () { 0 }
573 |  |  |  |  | ;
574 |  |  |  |  |
575 |  |  |  |  |
576 |  |  |  |  | *__CAG_ENV__::TRACK_UNDEFER_FAIL = (
577 |  |  |  |  | $INC{'Test/Builder.pm'} || $INC{'Test/Builder2.pm'}
578 |  |  |  |  | and
579 |  |  |  |  | $0 =~ m|^ x?t / .+ \.t $|x
580 |  |  |  |  | ) ? sub () { 1 }
581 |  |  |  |  | : sub () { 0 }
582 |  |  |  |  | ;
583 | 1 | 523µs | 1 | 1.56ms | } # spent 1.56ms making 1 call to Class::Accessor::Grouped::BEGIN@529
584 |  |  |  |  |
585 |  |  |  |  | # Autodetect unless flag supplied
586 | 1 | 200ns |  |  | my $xsa_autodetected;
587 | 3 | 1µs |  |  | if (! defined $USE_XS) {
588 |  |  |  |  | $USE_XS = __CAG_ENV__::NO_CXSA ? 0 : 1;
589 |  |  |  |  | $xsa_autodetected++;
590 |  |  |  |  | }
591 |  |  |  |  |
592 |  |  |  |  | my $maker_templates = {
593 |  |  |  |  | rw => {
594 |  |  |  |  | xs_call => 'accessors',
595 |  |  |  |  | # spent 1.27ms (1.16+108µs) within Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:606] which was called 179 times, avg 7µs/call: # 179 times (1.16ms+108µs) by Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:810] at line 803, avg 7µs/call pp_code => sub {
596 | 895 | 1.48ms |  |  | my $set = "set_$_[0]";
597 |  |  |  |  | my $get = "get_$_[0]";
598 |  |  |  |  | my $field = $_[1];
599 |  |  | 179 | 108µs | $field =~ s/'/\\'/g; # spent 108µs making 179 calls to Class::Accessor::Grouped::CORE:subst, avg 605ns/call
600 |  |  |  |  |
601 |  |  |  |  | "
602 |  |  |  |  | \@_ != 1
603 |  |  |  |  | ? shift->$set('$field', \@_)
604 |  |  |  |  | : shift->$get('$field')
605 |  |  |  |  | "
606 |  |  |  |  | },
607 |  |  |  |  | },
608 |  |  |  |  | ro => {
609 |  |  |  |  | xs_call => 'getters',
610 |  |  |  |  | pp_code => sub {
611 |  |  |  |  | my $get = "get_$_[0]";
612 |  |  |  |  | my $field = $_[1];
613 |  |  |  |  | $field =~ s/'/\\'/g;
614 |  |  |  |  |
615 |  |  |  |  | "
616 |  |  |  |  | \@_ == 1
617 |  |  |  |  | ? shift->$get('$field')
618 |  |  |  |  | : do {
619 |  |  |  |  | my \$caller = caller;
620 |  |  |  |  | my \$class = ref \$_[0] || \$_[0];
621 |  |  |  |  | Carp::croak(\"'\$caller' cannot alter the value of '$field' \".
622 |  |  |  |  | \"(read-only attributes of class '\$class')\");
623 |  |  |  |  | }
624 |  |  |  |  | "
625 |  |  |  |  | },
626 |  |  |  |  | },
627 |  |  |  |  | wo => {
628 |  |  |  |  | xs_call => 'setters',
629 |  |  |  |  | pp_code => sub {
630 |  |  |  |  | my $set = "set_$_[0]";
631 |  |  |  |  | my $field = $_[1];
632 |  |  |  |  | $field =~ s/'/\\'/g;
633 |  |  |  |  |
634 |  |  |  |  | "
635 |  |  |  |  | \@_ != 1
636 |  |  |  |  | ? shift->$set('$field', \@_)
637 |  |  |  |  | : do {
638 |  |  |  |  | my \$caller = caller;
639 |  |  |  |  | my \$class = ref \$_[0] || \$_[0];
640 |  |  |  |  | Carp::croak(\"'\$caller' cannot access the value of '$field' \".
641 |  |  |  |  | \"(write-only attributes of class '\$class')\");
642 |  |  |  |  | }
643 |  |  |  |  | "
644 |  |  |  |  | },
645 |  |  |  |  | },
646 | 1 | 10µs |  |  | };
647 |  |  |  |  |
648 |  |  |  |  |
649 | 1 | 400ns |  |  | my ($accessor_maker_cache, $no_xsa_warned_classes);
650 |  |  |  |  |
651 |  |  |  |  | # can't use pkg_gen to track this stuff, as it doesn't
652 |  |  |  |  | # detect superclass mucking
653 | 1 | 10µs | 1 | 2µs | my $original_simple_getter = __PACKAGE__->can ('get_simple'); # spent 2µs making 1 call to UNIVERSAL::can
654 | 1 | 4µs | 1 | 1µs | my $original_simple_setter = __PACKAGE__->can ('set_simple'); # spent 1µs making 1 call to UNIVERSAL::can
655 |  |  |  |  |
656 |  |  |  |  | # Note!!! Unusual signature
657 |  |  |  |  | # spent 24.1ms (20.1+4.05) within Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:810] which was called 822 times, avg 29µs/call: # 822 times (20.1ms+4.05ms) by Class::Accessor::Grouped::make_group_accessor at line 397, avg 29µs/call $gen_accessor = sub {
658 | 2466 | 4.66ms |  |  | my ($type, $class, $group, $field, $methname) = @_;
659 |  |  | 822 | 402µs | if (my $c = Scalar::Util::blessed( $class )) { # spent 402µs making 822 calls to Scalar::Util::blessed, avg 488ns/call
660 |  |  |  |  | $class = $c;
661 |  |  |  |  | }
662 |  |  |  |  |
663 |  |  |  |  | # When installing an XSA simple accessor, we need to make sure we are not
664 |  |  |  |  | # short-circuiting a (compile or runtime) get_simple/set_simple override.
665 |  |  |  |  | # What we do here is install a lazy first-access check, which will decide
666 |  |  |  |  | # the ultimate coderef being placed in the accessor slot
667 |  |  |  |  | #
668 |  |  |  |  | # Also note that the *original* class will always retain this shim, as
669 |  |  |  |  | # different branches inheriting from it may have different overrides.
670 |  |  |  |  | # Thus the final method (properly labeled and all) is installed in the
671 |  |  |  |  | # calling-package's namespace
672 | 1214 | 2.70ms |  |  | if ($USE_XS and $group eq 'simple') {
673 |  |  |  |  | die sprintf( "Class::XSAccessor requested but not available:\n%s\n", __CAG_ENV__::NO_CXSA )
674 |  |  |  |  | if __CAG_ENV__::NO_CXSA;
675 |  |  |  |  |
676 |  |  |  |  | my ($expected_cref, $cached_implementation);
677 |  |  |  |  | my $ret = $expected_cref = sub {
678 | 362 | 1.18ms | 78 | 60µs | my $current_class = Scalar::Util::blessed( $_[0] ) || $_[0]; # spent 60µs making 78 calls to Scalar::Util::blessed, avg 773ns/call
679 |  |  |  |  |
680 |  |  |  |  | # $cached_implementation will be set only if the shim got
681 |  |  |  |  | # 'around'ed, in which case it is handy to avoid re-running
682 |  |  |  |  | # this block over and over again
683 | 36 | 453µs |  |  | my $resolved_implementation = $cached_implementation->{$current_class} || do {
684 | 72 | 397µs | 72 | 202µs | if ( # spent 202µs making 72 calls to UNIVERSAL::can, avg 3µs/call
685 |  |  |  |  | ($current_class->can('get_simple')||0) == $original_simple_getter
686 |  |  |  |  | &&
687 |  |  |  |  | ($current_class->can('set_simple')||0) == $original_simple_setter
688 |  |  |  |  | ) {
689 |  |  |  |  | # nothing has changed, might as well use the XS crefs
690 |  |  |  |  | #
691 |  |  |  |  | # note that by the time this code executes, we already have
692 |  |  |  |  | # *objects* (since XSA works on 'simple' only by definition).
693 |  |  |  |  | # If someone is mucking with the symbol table *after* there
694 |  |  |  |  | # are some objects already - look! many, shiny pieces! :)
695 |  |  |  |  | #
696 |  |  |  |  | # The weird breeder thingy is because XSA does not have an
697 |  |  |  |  | # interface returning *just* a coderef, without installing it
698 |  |  |  |  | # anywhere :(
699 |  |  | 36 | 3.36ms | Class::XSAccessor->import( # spent 3.36ms making 36 calls to Class::XSAccessor::import, avg 93µs/call
700 |  |  |  |  | replace => 1,
701 |  |  |  |  | class => '__CAG__XSA__BREEDER__',
702 |  |  |  |  | $maker_templates->{$type}{xs_call} => {
703 |  |  |  |  | $methname => $field,
704 |  |  |  |  | },
705 |  |  |  |  | );
706 |  |  | 36 | 47µs | __CAG__XSA__BREEDER__->can($methname); # spent 47µs making 36 calls to UNIVERSAL::can, avg 1µs/call
707 |  |  |  |  | }
708 |  |  |  |  | else {
709 |  |  |  |  | if (! $xsa_autodetected and ! $no_xsa_warned_classes->{$current_class}++) {
710 |  |  |  |  | # not using Carp since the line where this happens doesn't mean much
711 |  |  |  |  | warn 'Explicitly requested use of Class::XSAccessor disabled for objects of class '
712 |  |  |  |  | . "'$current_class' inheriting from '$class' due to an overriden get_simple and/or "
713 |  |  |  |  | . "set_simple\n";
714 |  |  |  |  | }
715 |  |  |  |  |
716 |  |  |  |  | do {
717 |  |  |  |  | # that's faster than local
718 |  |  |  |  | $USE_XS = 0;
719 |  |  |  |  | my $c = $gen_accessor->($type, $class, 'simple', $field, $methname);
720 |  |  |  |  | $USE_XS = 1;
721 |  |  |  |  | $c;
722 |  |  |  |  | };
723 |  |  |  |  | }
724 |  |  |  |  | };
725 |  |  |  |  |
726 |  |  |  |  | # if after this shim was created someone wrapped it with an 'around',
727 |  |  |  |  | # we can not blindly reinstall the method slot - we will destroy the
728 |  |  |  |  | # wrapper. Silently chain execution further...
729 | 138 | 293µs | 78 | 116µs | if ( !$expected_cref or $expected_cref != ($current_class->can($methname)||0) ) { # spent 116µs making 78 calls to UNIVERSAL::can, avg 1µs/call
730 |  |  |  |  |
731 |  |  |  |  | # there is no point in re-determining it on every subsequent call,
732 |  |  |  |  | # just store for future reference
733 |  |  |  |  | $cached_implementation->{$current_class} ||= $resolved_implementation;
734 |  |  |  |  |
735 |  |  |  |  | # older perls segfault if the cref behind the goto throws
736 |  |  |  |  | # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878
737 |  |  |  |  | return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO;
738 |  |  |  |  |
739 |  |  | 46 | 20µs | goto $resolved_implementation; # spent 11µs making 32 calls to __CAG__XSA__BREEDER__::_columns, avg 359ns/call # spent 4µs making 6 calls to __CAG__XSA__BREEDER__::source_name, avg 583ns/call # spent 3µs making 4 calls to __CAG__XSA__BREEDER__::name, avg 675ns/call # spent 2µs making 4 calls to __CAG__XSA__BREEDER__::_ordered_columns, avg 550ns/call
740 |  |  |  |  | }
741 |  |  |  |  |
742 |  |  |  |  | if (__CAG_ENV__::TRACK_UNDEFER_FAIL) {
743 |  |  |  |  | my $deferred_calls_seen = do {
744 | 3 | 88µs | 2 | 44µs | # spent 28µs (12+16) within Class::Accessor::Grouped::BEGIN@744 which was called: # once (12µs+16µs) by base::import at line 744 no strict 'refs'; # spent 28µs making 1 call to Class::Accessor::Grouped::BEGIN@744 # spent 16µs making 1 call to strict::unimport
745 |  |  |  |  | \%{"${current_class}::__cag_deferred_xs_shim_invocations"}
746 |  |  |  |  | };
747 |  |  |  |  | my @cframe = caller(0);
748 |  |  |  |  | if (my $already_seen = $deferred_calls_seen->{$cframe[3]}) {
749 |  |  |  |  | Carp::carp (
750 |  |  |  |  | "Deferred version of method $cframe[3] invoked more than once (originally "
751 |  |  |  |  | . "invoked at $already_seen). This is a strong indication your code has "
752 |  |  |  |  | . 'cached the original ->can derived method coderef, and is using it instead '
753 |  |  |  |  | . 'of the proper method re-lookup, causing performance regressions'
754 |  |  |  |  | );
755 |  |  |  |  | }
756 |  |  |  |  | else {
757 |  |  |  |  | $deferred_calls_seen->{$cframe[3]} = "$cframe[1] line $cframe[2]";
758 |  |  |  |  | }
759 |  |  |  |  | }
760 |  |  |  |  |
761 |  |  |  |  | # install the resolved implementation into the code slot so we do not
762 |  |  |  |  | # come here anymore (hopefully)
763 |  |  |  |  | # since XSAccessor was available - so is Sub::Name
764 |  |  |  |  | {
765 | 3 | 19µs | 2 | 22µs | # spent 14µs (7+8) within Class::Accessor::Grouped::BEGIN@765 which was called: # once (7µs+8µs) by base::import at line 765 no strict 'refs'; # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@765 # spent 8µs making 1 call to strict::unimport
766 | 3 | 113µs | 2 | 35µs | # spent 21µs (7+14) within Class::Accessor::Grouped::BEGIN@766 which was called: # once (7µs+14µs) by base::import at line 766 no warnings 'redefine'; # spent 21µs making 1 call to Class::Accessor::Grouped::BEGIN@766 # spent 14µs making 1 call to warnings::unimport
767 |  |  |  |  |
768 | 128 | 570µs |  |  | my $fq_name = "${current_class}::${methname}";
769 |  |  | 32 | 113µs | *$fq_name = Sub::Name::subname($fq_name, $resolved_implementation); # spent 113µs making 32 calls to Sub::Name::subname, avg 4µs/call
770 |  |  |  |  |
771 |  |  |  |  | # need to update what the shim expects too *in case* its
772 |  |  |  |  | # ->can was cached for some moronic reason
773 |  |  |  |  | $expected_cref = $resolved_implementation;
774 |  |  | 32 | 48µs | Scalar::Util::weaken($expected_cref); # spent 48µs making 32 calls to Scalar::Util::weaken, avg 2µs/call
775 |  |  |  |  | }
776 |  |  |  |  |
777 |  |  |  |  | # older perls segfault if the cref behind the goto throws
778 |  |  |  |  | # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878
779 |  |  |  |  | return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO;
780 |  |  |  |  |
781 |  |  | 32 | 17µs | goto $resolved_implementation; # spent 2µs making 1 call to DBIx::Class::ResultSet::result_source # spent 700ns making 1 call to DBIx::Class::ResultSource::Table::name # spent 600ns making 1 call to DBIx::Class::ResultSource::Table::_primaries # spent 600ns making 1 call to DBIx::Class::Storage::DBI::schema # spent 500ns making 1 call to DBIx::Class::ResultSet::_result_class # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_columns # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::_ordered_columns # spent 500ns making 1 call to DBIx::Class::ResultSource::Table::source_name # spent 500ns making 1 call to DBIx::Class::ResultSource::View::view_definition # spent 500ns making 1 call to DBIx::Class::SQLMaker::SQLite::limit_dialect # spent 500ns making 1 call to DBIx::Class::Storage::DBI::Cursor::sth # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::_conn_pid # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::_dbh_autocommit # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::debug # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::disable_sth_caching # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::on_connect_do # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::transaction_depth # spent 500ns making 1 call to DBIx::Class::Storage::DBI::SQLite::unsafe # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_connect_info # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbh # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbh_details # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbi_connect_info # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_dbic_connect_attributes # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_driver_determined # spent 500ns making 1 call to DBIx::Class::Storage::DBI::_sql_maker_opts # spent 400ns making 1 call to DBIx::Class::ResultSource::Table::_relationships # spent 400ns making 1 call to DBIx::Class::ResultSource::Table::_unique_constraints # spent 400ns making 1 call to DBIx::Class::ResultSource::Table::resultset_attributes # spent 400ns making 1 call to DBIx::Class::ResultSource::View::is_virtual # spent 400ns making 1 call to DBIx::Class::Storage::DBI::SQLite::on_connect_call # spent 400ns making 1 call to DBIx::Class::Storage::DBI::_sql_maker # spent 300ns making 1 call to DBIx::Class::SQLMaker::SQLite::name_sep
782 |  |  |  |  | };
783 |  |  |  |  |
784 |  |  | 98 | 93µs | Scalar::Util::weaken($expected_cref); # to break the self-reference # spent 93µs making 98 calls to Scalar::Util::weaken, avg 952ns/call
785 |  |  |  |  | $ret;
786 |  |  |  |  | }
787 |  |  |  |  |
788 |  |  |  |  | # no Sub::Name - just install the coderefs directly (compiling every time)
789 |  |  |  |  | elsif (__CAG_ENV__::NO_SUBNAME) {
790 |  |  |  |  | my $src = $accessor_maker_cache->{source}{$type}{$group}{$field} ||=
791 |  |  |  |  | $maker_templates->{$type}{pp_code}->($group, $field);
792 |  |  |  |  |
793 | 3 | 122µs | 2 | 23µs | # spent 15µs (7+8) within Class::Accessor::Grouped::BEGIN@793 which was called: # once (7µs+8µs) by base::import at line 793 no warnings 'redefine'; # spent 15µs making 1 call to Class::Accessor::Grouped::BEGIN@793 # spent 8µs making 1 call to warnings::unimport
794 |  |  |  |  | local $@ if __CAG_ENV__::UNSTABLE_DOLLARAT;
795 |  |  |  |  | eval "sub ${class}::${methname} { $src }";
796 |  |  |  |  |
797 |  |  |  |  | undef; # so that no further attempt will be made to install anything
798 |  |  |  |  | }
799 |  |  |  |  |
800 |  |  |  |  | # a coderef generator with a variable pad (returns a fresh cref on every invocation)
801 |  |  |  |  | else {
802 | 537 | 11.9ms | 724 | 2.28ms | ($accessor_maker_cache->{pp}{$type}{$group}{$field} ||= do { # spent 264µs making 74 calls to Class::Accessor::Grouped::__ANON__[(eval 300)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 192µs making 52 calls to Class::Accessor::Grouped::__ANON__[(eval 301)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 114µs making 20 calls to Class::Accessor::Grouped::__ANON__[(eval 358)[Class/Accessor/Grouped.pm:807]:5], avg 6µs/call # spent 110µs making 32 calls to Class::Accessor::Grouped::__ANON__[(eval 309)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 96µs making 28 calls to Class::Accessor::Grouped::__ANON__[(eval 367)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 92µs making 30 calls to Class::Accessor::Grouped::__ANON__[(eval 310)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 89µs making 28 calls to Class::Accessor::Grouped::__ANON__[(eval 366)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 68µs making 18 calls to Class::Accessor::Grouped::__ANON__[(eval 302)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 53µs making 14 calls to Class::Accessor::Grouped::__ANON__[(eval 1305)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 33µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 304)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 29µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1376)[Class/Accessor/Grouped.pm:807]:5], avg 7µs/call # spent 27µs making 6 calls to Class::Accessor::Grouped::__ANON__[(eval 1297)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 25µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 374)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 25µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 357)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 23µs making 8 calls to Class::Accessor::Grouped::__ANON__[(eval 394)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 20µs making 6 calls to Class::Accessor::Grouped::__ANON__[(eval 397)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 16µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 353)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 16µs making 6 calls to Class::Accessor::Grouped::__ANON__[(eval 1298)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 15µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 359)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 15µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 303)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 15µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 364)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1373)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1324)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1370)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 383)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 14µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1311)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 13µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 391)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1368)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1314)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1312)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 12µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 386)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1365)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1366)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 360)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 385)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 392)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1315)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1375)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 365)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1371)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1374)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1316)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1372)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 11µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1369)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 384)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1328)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 10µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1340)[Class/Accessor/Grouped.pm:807]:5], avg 5µs/call # spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1357)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 10µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1385)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 9µs making 4 calls to Class::Accessor::Grouped::__ANON__[(eval 1341)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 8µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1394)[Class/Accessor/Grouped.pm:807]:5], avg 4µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 272)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 295)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1310)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 356)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1404)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1307)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 334)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 354)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1363)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1318)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1390)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1391)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1392)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1400)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 348)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1336)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1342)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1348)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1364)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 332)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 336)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 297)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1304)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1332)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1335)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1355)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1360)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1367)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1397)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1402)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 6µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 373)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1344)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1356)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 338)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1352)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 287)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1326)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1378)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 298)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 344)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1306)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1358)[Class/Accessor/Grouped.pm:807]:5], avg 3µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 345)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 396)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1393)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1395)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 362)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 375)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1317)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1384)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1398)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1403)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1405)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 299)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 349)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 355)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 368)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 370)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 371)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 379)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 380)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1299)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1320)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1321)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1322)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1325)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1327)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1329)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1330)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1331)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1333)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1345)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1354)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1359)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1383)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1396)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 363)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 369)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 382)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 393)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 395)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1337)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1339)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1362)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1377)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1379)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 333)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 337)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1399)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 296)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 347)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1308)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1309)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1319)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1323)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1334)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1343)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1346)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1349)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1350)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1353)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1381)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1401)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 307)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 308)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 335)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 376)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 387)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 389)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1338)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 5µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1380)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1351)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 305)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 306)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 351)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 1347)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 352)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 378)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 388)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 398)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call # spent 4µs making 2 calls to Class::Accessor::Grouped::__ANON__[(eval 381)[Class/Accessor/Grouped.pm:807]:5], avg 2µs/call
803 |  |  | 179 | 1.27ms | my $src = $accessor_maker_cache->{source}{$type}{$group}{$field} ||= # spent 1.27ms making 179 calls to Class::Accessor::Grouped::__ANON__[Class/Accessor/Grouped.pm:606], avg 7µs/call
804 |  |  |  |  | $maker_templates->{$type}{pp_code}->($group, $field);
805 |  |  |  |  |
806 |  |  |  |  | local $@ if __CAG_ENV__::UNSTABLE_DOLLARAT;
807 |  |  |  |  | eval "sub { my \$dummy; sub { \$dummy if 0; $src } }" or die $@; # spent 105ms executing statements in string eval # includes 264µs spent executing 74 calls to 1 sub defined therein. # spent 90.8ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 69.6ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 65.3ms executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 42.1ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 40.4ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 32.3ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 26.5ms executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 20.7ms executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 16.7ms executing statements in string eval # includes 192µs spent executing 52 calls to 1 sub defined therein. # spent 9.89ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 9.12ms executing statements in string eval # includes 114µs spent executing 20 calls to 1 sub defined therein. # spent 6.88ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 4.86ms executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 3.41ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 2.61ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 2.57ms executing statements in string eval # includes 15µs spent executing 4 calls to 1 sub defined therein. # spent 1.83ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 1.70ms executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 1.56ms executing statements in string eval # includes 33µs spent executing 8 calls to 1 sub defined therein. # spent 1.27ms executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 973µs executing statements in string eval # includes 15µs spent executing 4 calls to 1 sub defined therein. # spent 766µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 694µs executing statements in 2 string evals (merged) # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 681µs executing statements in string eval # includes 16µs spent executing 4 calls to 1 sub defined therein. # spent 617µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 568µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 194µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 160µs executing statements in string eval # includes 110µs spent executing 32 calls to 1 sub defined therein. # spent 138µs executing statements in string eval # includes 96µs spent executing 28 calls to 1 sub defined therein. # spent 135µs executing statements in string eval # includes 89µs spent executing 28 calls to 1 sub defined therein. # spent 134µs executing statements in string eval # includes 92µs spent executing 30 calls to 1 sub defined therein. # spent 134µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 99µs executing statements in string eval # includes 8µs spent executing 2 calls to 1 sub defined therein. # spent 95µs executing statements in string eval # includes 68µs spent executing 18 calls to 1 sub defined therein. # spent 76µs executing statements in string eval # includes 53µs spent executing 14 calls to 1 sub defined therein. # spent 61µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 60µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 50µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 42µs executing statements in string eval # includes 27µs spent executing 6 calls to 1 sub defined therein. # spent 42µs executing statements in string eval # includes 29µs spent executing 4 calls to 1 sub defined therein. # spent 41µs executing statements in string eval # includes 25µs spent executing 8 calls to 1 sub defined therein. # spent 40µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 40µs executing statements in string eval # includes 23µs spent executing 8 calls to 1 sub defined therein. # spent 39µs executing statements in string eval # includes 25µs spent executing 8 calls to 1 sub defined therein. # spent 38µs executing statements in 3 string evals (merged) # includes 16µs spent executing 6 calls to 1 sub defined therein. # spent 35µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 35µs executing statements in string eval # includes 20µs spent executing 6 calls to 1 sub defined therein. # spent 34µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 33µs executing statements in 2 string evals (merged) # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 32µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 30µs executing statements in 2 string evals (merged) # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 29µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 25µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 25µs executing statements in 2 string evals (merged) # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 25µs executing statements in string eval # includes 15µs spent executing 4 calls to 1 sub defined therein. # spent 25µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 24µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 13µs spent executing 4 calls to 1 sub defined therein. # spent 23µs executing statements in string eval # includes 14µs spent executing 4 calls to 1 sub defined therein. # spent 22µs executing statements in 2 string evals (merged) # includes 9µs spent executing 4 calls to 1 sub defined therein. # spent 22µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 22µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 12µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 21µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 11µs spent executing 4 calls to 1 sub defined therein. # spent 20µs executing statements in string eval # includes 10µs spent executing 4 calls to 1 sub defined therein. # spent 19µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 18µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 18µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 17µs executing statements in string eval # includes 10µs spent executing 2 calls to 1 sub defined therein. # spent 17µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 17µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 16µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 15µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 15µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 14µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 13µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 6µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 4µs spent executing 2 calls to 1 sub defined therein. # spent 11µs executing statements in string eval # includes 5µs spent executing 2 calls to 1 sub defined therein.
808 |  |  |  |  | })->()
809 |  |  |  |  | }
810 | 1 | 3µs |  |  | };
811 |  |  |  |  |
812 | 1 | 11µs |  |  | 1;
|  |  |  |  | # spent 2µs within Class::Accessor::Grouped::CORE:match which was called: # once (2µs+0s) by base::import at line 17 sub Class::Accessor::Grouped::CORE:match; # opcode
|  |  |  |  | # spent 108µs within Class::Accessor::Grouped::CORE:subst which was called 179 times, avg 605ns/call: # 179 times (108µs+0s) by Class::Accessor::Grouped::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/Class/Accessor/Grouped.pm:606] at line 599, avg 605ns/call sub Class::Accessor::Grouped::CORE:subst; # opcode