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 |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
85383 | 14 | 14 | 1.19s | 1.39s | get_inherited | Class::Accessor::Grouped::
822 | 1 | 1 | 20.1ms | 24.1ms | __ANON__[:810] | Class::Accessor::Grouped::
359 | 1 | 1 | 9.73ms | 39.8ms | _mk_group_accessors | Class::Accessor::Grouped::
359 | 21 | 13 | 2.29ms | 42.1ms | mk_group_accessors | Class::Accessor::Grouped::
822 | 1 | 1 | 2.25ms | 26.4ms | make_group_accessor | Class::Accessor::Grouped::
221 | 15 | 15 | 1.46ms | 1.67ms | set_inherited | Class::Accessor::Grouped::
179 | 1 | 1 | 1.16ms | 1.27ms | __ANON__[:606] | Class::Accessor::Grouped::
1 | 1 | 1 | 667µs | 1.56ms | BEGIN@529 | Class::Accessor::Grouped::
50 | 1 | 1 | 367µs | 451µs | get_super_paths | Class::Accessor::Grouped::
179 | 1 | 1 | 108µs | 108µs | CORE:subst (opcode) | Class::Accessor::Grouped::
1 | 1 | 1 | 12µs | 14µs | BEGIN@2 | Class::Accessor::Grouped::
1 | 1 | 1 | 12µs | 28µs | BEGIN@744 | Class::Accessor::Grouped::
1 | 1 | 1 | 8µs | 22µs | BEGIN@38 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 15µs | BEGIN@250 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 18µs | BEGIN@37 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 16µs | BEGIN@249 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 21µs | BEGIN@766 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 15µs | BEGIN@793 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 14µs | BEGIN@3 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 14µs | BEGIN@765 | Class::Accessor::Grouped::
1 | 1 | 1 | 7µs | 14µs | BEGIN@297 | Class::Accessor::Grouped::
1 | 1 | 1 | 4µs | 4µs | BEGIN@7 | Class::Accessor::Grouped::
1 | 1 | 1 | 4µs | 4µs | BEGIN@5 | Class::Accessor::Grouped::
1 | 1 | 1 | 4µs | 4µs | BEGIN@4 | Class::Accessor::Grouped::
1 | 1 | 1 | 4µs | 4µs | BEGIN@21 | Class::Accessor::Grouped::
1 | 1 | 1 | 2µs | 2µs | CORE:match (opcode) | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | __ANON__[:543] | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | __ANON__[:559] | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | __ANON__[:625] | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | __ANON__[:644] | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | __ANON__[:782] | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | get_component_class | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | get_simple | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | make_group_ro_accessor | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | make_group_wo_accessor | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | mk_group_ro_accessors | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | mk_group_wo_accessors | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | set_component_class | Class::Accessor::Grouped::
0 | 0 | 0 | 0s | 0s | set_simple | Class::Accessor::Grouped::
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 # 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 # 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 # 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 # 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 | ||||
8 | 1 | 5µs | if ($] < 5.009_005) { | ||
9 | require MRO::Compat; | ||||
10 | } | ||||
11 | else { | ||||
12 | 1 | 900ns | 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 # 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 | ||||
34 | 359 | 359µs | my($self, $maker, $group, @fields) = @_; | ||
35 | 359 | 941µs | 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 # 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 # 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 | 2.12ms | 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 | 359 | 990µs | foreach (@fields) { | ||
44 | 411 | 153µs | if( $_ eq 'DESTROY' ) { | ||
45 | Carp::carp("Having a data accessor named DESTROY in ". | ||||
46 | "'$class' is unwise."); | ||||
47 | } | ||||
48 | |||||
49 | 411 | 300µs | my ($name, $field) = (ref $_) | ||
50 | ? (@$_) | ||||
51 | : ($_, $_) | ||||
52 | ; | ||||
53 | |||||
54 | 411 | 301µs | my $alias = "_${name}_accessor"; | ||
55 | |||||
56 | 411 | 470µs | 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 | 822 | 1.03ms | 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 | 822 | 537µs | my $fq_meth = "${class}::${meth}"; | ||
64 | |||||
65 | 822 | 6.03ms | 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 | ||||
123 | 359 | 355µs | my ($self, $group, @fields) = @_; | ||
124 | |||||
125 | 359 | 1.13ms | 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 | 359 | 800µs | 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 | ||||
235 | 85383 | 20.2ms | my $class; | ||
236 | |||||
237 | 85383 | 815ms | 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 | 2800 | 2.17ms | $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 # 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 # spent 15µs making 1 call to Class::Accessor::Grouped::BEGIN@250
# spent 8µs making 1 call to warnings::unimport |
251 | |||||
252 | 31510 | 40.5ms | my $cag_slot = '::__cag_'. $_[1]; | ||
253 | 31510 | 220ms | 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 | 105ms | 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 | 17553 | 54.9ms | if ( $cur_gen != ${$class.'::__cag_pkg_gen__'} ) { | ||
258 | 50 | 1.29ms | 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 | 50 | 104µs | ${$class.'::__cag_pkg_gen__'} = $cur_gen; | ||
260 | } | ||||
261 | |||||
262 | 17553 | 51.3ms | for (@{$class.'::__cag_supers__'}) { | ||
263 | 43553 | 204ms | return ${$_.$cag_slot} if defined(${$_.$cag_slot}); | ||
264 | }; | ||||
265 | |||||
266 | 306 | 1.54ms | 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] | ||||
290 | 221 | 1.24ms | 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 # spent 14µs making 1 call to Class::Accessor::Grouped::BEGIN@297
# spent 7µs making 1 call to strict::unimport |
298 | |||||
299 | 140 | 722µs | 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 | ||||
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 # 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 | ||||
530 | |||||
531 | 1 | 200ns | die "Huh?! No minimum C::XSA version?!\n" | ||
532 | unless $__minimum_xsa_version; | ||||
533 | |||||
534 | 1 | 200ns | local $@; | ||
535 | 1 | 200ns | my $err; | ||
536 | |||||
537 | |||||
538 | 3 | 3µ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 | 1 | 2µs | ; | ||
546 | |||||
547 | |||||
548 | $err = eval { | ||||
549 | 1 | 68µs | require Class::XSAccessor; | ||
550 | 1 | 19µs | 1 | 8µs | Class::XSAccessor->VERSION($__minimum_xsa_version); # spent 8µs making 1 call to UNIVERSAL::VERSION |
551 | 1 | 2µs | require Sub::Name; | ||
552 | 1 | 800ns | 1; | ||
553 | 1 | 1µ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 | 1 | 3µs | ; | ||
562 | |||||
563 | |||||
564 | *__CAG_ENV__::BROKEN_GOTO = ($] < '5.008009') | ||||
565 | ? sub () { 1 } | ||||
566 | : sub () { 0 } | ||||
567 | 1 | 4µs | ; | ||
568 | |||||
569 | |||||
570 | *__CAG_ENV__::UNSTABLE_DOLLARAT = ($] < '5.013002') | ||||
571 | ? sub () { 1 } | ||||
572 | : sub () { 0 } | ||||
573 | 1 | 2µs | ; | ||
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 | 1 | 7µs | ; | ||
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 | 1 | 300ns | if (! defined $USE_XS) { | ||
588 | 1 | 200ns | $USE_XS = __CAG_ENV__::NO_CXSA ? 0 : 1; | ||
589 | 1 | 600ns | $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 | ||||
596 | 179 | 128µs | my $set = "set_$_[0]"; | ||
597 | 179 | 91µs | my $get = "get_$_[0]"; | ||
598 | 179 | 57µs | my $field = $_[1]; | ||
599 | 179 | 485µs | 179 | 108µs | $field =~ s/'/\\'/g; # spent 108µs making 179 calls to Class::Accessor::Grouped::CORE:subst, avg 605ns/call |
600 | |||||
601 | 179 | 723µs | " | ||
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 | ||||
658 | 822 | 644µs | my ($type, $class, $group, $field, $methname) = @_; | ||
659 | 822 | 2.00ms | 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 | 822 | 2.02ms | if ($USE_XS and $group eq 'simple') { | ||
673 | 98 | 13µs | die sprintf( "Class::XSAccessor requested but not available:\n%s\n", __CAG_ENV__::NO_CXSA ) | ||
674 | if __CAG_ENV__::NO_CXSA; | ||||
675 | |||||
676 | 98 | 18µs | my ($expected_cref, $cached_implementation); | ||
677 | my $ret = $expected_cref = sub { | ||||
678 | 78 | 275µs | 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 | 78 | 66µs | my $resolved_implementation = $cached_implementation->{$current_class} || do { | ||
684 | 36 | 453µ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 | 209µs | 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 | 188µs | 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 | 78 | 357µ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 | 46 | 19µs | $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 | 46 | 4µs | return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO; | ||
738 | |||||
739 | 46 | 269µs | 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 | 32 | 6µs | 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 # 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 | 35 | 32µ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 # 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 # spent 21µs making 1 call to Class::Accessor::Grouped::BEGIN@766
# spent 14µs making 1 call to warnings::unimport |
767 | |||||
768 | 32 | 50µs | my $fq_name = "${current_class}::${methname}"; | ||
769 | 32 | 335µs | 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 | 32 | 24µs | $expected_cref = $resolved_implementation; | ||
774 | 32 | 161µs | 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 | 32 | 3µs | return $resolved_implementation->(@_) if __CAG_ENV__::BROKEN_GOTO; | ||
780 | |||||
781 | 32 | 463µs | 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 | 98 | 517µs | }; | ||
783 | |||||
784 | 98 | 301µs | 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 | 98 | 49µs | $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 # 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 | 724 | 1.80ms | 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 | 550µs | 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 | 179 | 40µs | local $@ if __CAG_ENV__::UNSTABLE_DOLLARAT; | ||
807 | 179 | 11.3ms | 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 | |||||
# 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 |