← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 16:10:05 2022
Reported on Wed Dec 14 16:12:58 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Data/Perl/Role/Collection/Hash.pm
StatementsExecuted 338850 statements in 758ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
7364811380ms7.02sData::Perl::Role::Collection::Hash::::getData::Perl::Role::Collection::Hash::get
3913811312ms333msData::Perl::Role::Collection::Hash::::kvData::Perl::Role::Collection::Hash::kv
6511781µs9.14msData::Perl::Role::Collection::Hash::::setData::Perl::Role::Collection::Hash::set
2933184µs211µsData::Perl::Role::Collection::Hash::::valuesData::Perl::Role::Collection::Hash::values
11158µs132µsData::Perl::Role::Collection::Hash::::BEGIN@5Data::Perl::Role::Collection::Hash::BEGIN@5
11112µs36µsData::Perl::Role::Collection::Hash::::BEGIN@77Data::Perl::Role::Collection::Hash::BEGIN@77
1117µs153µsData::Perl::Role::Collection::Hash::::BEGIN@7Data::Perl::Role::Collection::Hash::BEGIN@7
1117µs15µsData::Perl::Role::Collection::Hash::::BEGIN@9Data::Perl::Role::Collection::Hash::BEGIN@9
1115µs22µsData::Perl::Role::Collection::Hash::::BEGIN@8Data::Perl::Role::Collection::Hash::BEGIN@8
0000s0sData::Perl::Role::Collection::Hash::::_array_classData::Perl::Role::Collection::Hash::_array_class
0000s0sData::Perl::Role::Collection::Hash::::accessorData::Perl::Role::Collection::Hash::accessor
0000s0sData::Perl::Role::Collection::Hash::::allData::Perl::Role::Collection::Hash::all
0000s0sData::Perl::Role::Collection::Hash::::clearData::Perl::Role::Collection::Hash::clear
0000s0sData::Perl::Role::Collection::Hash::::countData::Perl::Role::Collection::Hash::count
0000s0sData::Perl::Role::Collection::Hash::::definedData::Perl::Role::Collection::Hash::defined
0000s0sData::Perl::Role::Collection::Hash::::deleteData::Perl::Role::Collection::Hash::delete
0000s0sData::Perl::Role::Collection::Hash::::existsData::Perl::Role::Collection::Hash::exists
0000s0sData::Perl::Role::Collection::Hash::::is_emptyData::Perl::Role::Collection::Hash::is_empty
0000s0sData::Perl::Role::Collection::Hash::::keysData::Perl::Role::Collection::Hash::keys
0000s0sData::Perl::Role::Collection::Hash::::newData::Perl::Role::Collection::Hash::new
0000s0sData::Perl::Role::Collection::Hash::::shallow_cloneData::Perl::Role::Collection::Hash::shallow_clone
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Data::Perl::Role::Collection::Hash;
211µs$Data::Perl::Role::Collection::Hash::VERSION = '0.002011';
3# ABSTRACT: Wrapping class for Perl's built in hash structure.
4
5356µs3206µs
# spent 132µs (58+74) within Data::Perl::Role::Collection::Hash::BEGIN@5 which was called: # once (58µs+74µs) by Role::Tiny::_load_module at line 5
use strictures 1;
# spent 132µs making 1 call to Data::Perl::Role::Collection::Hash::BEGIN@5 # spent 54µs making 1 call to strictures::import # spent 20µs making 1 call to strictures::VERSION
6
7227µs2299µs
# spent 153µs (7+146) within Data::Perl::Role::Collection::Hash::BEGIN@7 which was called: # once (7µs+146µs) by Role::Tiny::_load_module at line 7
use Role::Tiny;
# spent 153µs making 1 call to Data::Perl::Role::Collection::Hash::BEGIN@7 # spent 146µs making 1 call to Role::Tiny::import
8216µs239µs
# spent 22µs (5+17) within Data::Perl::Role::Collection::Hash::BEGIN@8 which was called: # once (5µs+17µs) by Role::Tiny::_load_module at line 8
use Scalar::Util qw/blessed/;
# spent 22µs making 1 call to Data::Perl::Role::Collection::Hash::BEGIN@8 # spent 17µs making 1 call to Exporter::import
92424µs223µs
# spent 15µs (7+8) within Data::Perl::Role::Collection::Hash::BEGIN@9 which was called: # once (7µs+8µs) by Role::Tiny::_load_module at line 9
use Module::Runtime qw/use_package_optimistically/;
# spent 15µs making 1 call to Data::Perl::Role::Collection::Hash::BEGIN@9 # spent 8µs making 1 call to Module::Runtime::import
10
11sub new { my $cl = shift; bless({ @_ }, $cl) }
12
13sub _array_class { 'Data::Perl::Collection::Array' }
14
15
# spent 7.02s (380ms+6.64) within Data::Perl::Role::Collection::Hash::get which was called 73648 times, avg 95µs/call: # 73648 times (380ms+6.64s) by Data::Perl::Collection::Hash::MooseLike::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Data/Perl/Collection/Hash/MooseLike.pm:22] at line 14 of Data/Perl/Collection/Hash/MooseLike.pm, avg 95µs/call
sub get {
167364812.2ms my $self = shift;
17
1873648209ms if (@_ > 1) {
19 my @res = @{$self}{@_};
20
21 blessed($self) ? use_package_optimistically($self->_array_class)->new(@res) : @res;
22 }
23 else {
2473648139ms476686.64s $self->{$_[0]};
# spent 6.64s making 47668 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 139µs/call
25 }
26}
27
28
# spent 9.14ms (781µs+8.36) within Data::Perl::Role::Collection::Hash::set which was called 65 times, avg 141µs/call: # 65 times (781µs+8.36ms) by Data::Perl::Collection::Hash::MooseLike::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Data/Perl/Collection/Hash/MooseLike.pm:22] at line 14 of Data/Perl/Collection/Hash/MooseLike.pm, avg 141µs/call
sub set {
29659µs my $self = shift;
3065132µs my @keys_idx = grep { ! ($_ % 2) } 0..$#_;
316576µs my @values_idx = grep { $_ % 2 } 0..$#_;
32
3365191µs394.47ms @{$self}{@_[@keys_idx]} = @_[@values_idx];
# spent 4.47ms making 39 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 115µs/call
34
356596µs393.86ms my @res = @{$self}{@_[@keys_idx]};
# spent 3.86ms making 39 calls to Mojo::URL::__ANON__[Mojo/URL.pm:3], avg 99µs/call
36
3765253µs6539µs blessed($self) ? use_package_optimistically($self->_array_class)->new(@res) : @res;
# spent 39µs making 65 calls to Scalar::Util::blessed, avg 600ns/call
38}
39
40sub delete {
41 my $self = shift;
42 my @res = CORE::delete @{$self}{@_};
43
44 blessed($self) ? use_package_optimistically($self->_array_class)->new(@res) : @res;
45}
46
47sub keys {
48 my ($self) = @_;
49
50 my @res = keys %{$self};
51
52 blessed($self) ? use_package_optimistically($self->_array_class)->new(@res) : @res;
53}
54
55sub exists { CORE::exists $_[0]->{$_[1]} }
56
57sub defined { CORE::defined $_[0]->{$_[1]} }
58
59
# spent 211µs (184+27) within Data::Perl::Role::Collection::Hash::values which was called 29 times, avg 7µs/call: # 16 times (96µs+12µs) by JSON::Schema::Modern::_canonical_resources at line 17 of (eval 346)[Sub/Quote.pm:3], avg 7µs/call # 12 times (80µs+14µs) by JSON::Schema::Modern::Document::_canonical_resources at line 17 of (eval 299)[Sub/Quote.pm:3], avg 8µs/call # once (8µs+1µs) by JSON::Schema::Modern::_get_vocabulary_values at line 17 of (eval 357)[Sub/Quote.pm:3]
sub values {
602915µs my ($self) = @_;
61
622956µs my @res = CORE::values %{$_[0]};
63
6429140µs2927µs blessed($self) ? use_package_optimistically($self->_array_class)->new(@res) : @res;
# spent 27µs making 29 calls to Scalar::Util::blessed, avg 931ns/call
65}
66
67
# spent 333ms (312+20.5) within Data::Perl::Role::Collection::Hash::kv which was called 39138 times, avg 8µs/call: # 39138 times (312ms+20.5ms) by JSON::Schema::Modern::Document::resource_pairs at line 17 of (eval 297)[Sub/Quote.pm:3], avg 8µs/call
sub kv {
683913820.9ms my ($self) = @_;
69
7039138164ms my @res = CORE::map { [ $_, $self->{$_} ] } CORE::keys %{$self};
71
7239138212ms3913820.5ms blessed($self) ? use_package_optimistically($self->_array_class)->new(@res) : @res;
# spent 20.5ms making 39138 calls to Scalar::Util::blessed, avg 525ns/call
73}
74
75
76{
773285µs260µs
# spent 36µs (12+24) within Data::Perl::Role::Collection::Hash::BEGIN@77 which was called: # once (12µs+24µs) by Role::Tiny::_load_module at line 77
no warnings 'once';
# spent 36µs making 1 call to Data::Perl::Role::Collection::Hash::BEGIN@77 # spent 24µs making 1 call to warnings::unimport
78
79 sub all {
80 my ($self) = @_;
81
82 my @res = CORE::map { $_, $self->{$_} } CORE::keys %{$self};
83
84 @res;
85 }
86
8711µs *elements = *all;
88}
89
90sub clear { %{$_[0]} = () }
91
92sub count { CORE::scalar CORE::keys %{$_[0]} }
93
94sub is_empty { CORE::scalar CORE::keys %{$_[0]} ? 0 : 1 }
95
96sub accessor {
97 if (@_ == 2) {
98 $_[0]->{$_[1]};
99 }
100 elsif (@_ > 2) {
101 $_[0]->{$_[1]} = $_[2];
102 }
103}
104
105sub shallow_clone { blessed($_[0]) ? bless({%{$_[0]}}, ref $_[0]) : {%{$_[0]}} }
106
10719µs1;
108
109=pod
110
111=encoding UTF-8
112
113=head1 NAME
114
115Data::Perl::Role::Collection::Hash - Wrapping class for Perl's built in hash structure.
116
117=head1 VERSION
118
119version 0.002011
120
121=head1 SYNOPSIS
122
123 use Data::Perl qw/hash/;
124
125 my $hash = hash(a => 1, b => 2);
126
127 $hash->values; # (1, 2)
128
129 $hash->set('foo', 'bar'); # (a => 1, b => 2, foo => 'bar')
130
131=head1 DESCRIPTION
132
133This class provides a wrapper and methods for interacting with a hash.
134All methods that return a list do so via a Data::Perl::Collection::Array
135object.
136
137=head1 PROVIDED METHODS
138
139=over 4
140
141=item B<new($key, $value, ...)>
142
143Given an optional list of keys/values, constructs a new Data::Perl::Collection::Hash
144object initalized with keys/values and returns it.
145
146=item B<get($key, $key2, $key3...)>
147
148Returns a list of values in the hash for the given keys.
149
150This method requires at least one argument.
151
152=item B<set($key =E<gt> $value, $key2 =E<gt> $value2...)>
153
154Sets the elements in the hash to the given values. It returns the new values
155set for each key, in the same order as the keys passed to the method.
156
157This method requires at least two arguments, and expects an even number of
158arguments.
159
160=item B<delete($key, $key2, $key3...)>
161
162Removes the elements with the given keys.
163
164Returns a list of values in the hash for the deleted keys.
165
166=item B<keys>
167
168Returns the list of keys in the hash.
169
170This method does not accept any arguments.
171
172=item B<exists($key)>
173
174Returns true if the given key is present in the hash.
175
176This method requires a single argument.
177
178=item B<defined($key)>
179
180Returns true if the value of a given key is defined.
181
182This method requires a single argument.
183
184=item B<values>
185
186Returns the list of values in the hash.
187
188This method does not accept any arguments.
189
190=item B<kv>
191
192Returns the key/value pairs in the hash as an array of array references.
193
194 for my $pair ( $object->option_pairs ) {
195 print "$pair->[0] = $pair->[1]\n";
196 }
197
198This method does not accept any arguments.
199
200=item B<elements/all>
201
202Returns the key/value pairs in the hash as a flattened list..
203
204This method does not accept any arguments.
205
206=item B<clear>
207
208Resets the hash to an empty value, like C<%hash = ()>.
209
210This method does not accept any arguments.
211
212=item B<count>
213
214Returns the number of elements in the hash. Also useful for not empty:
215C<< has_options => 'count' >>.
216
217This method does not accept any arguments.
218
219=item B<is_empty>
220
221If the hash is populated, returns false. Otherwise, returns true.
222
223This method does not accept any arguments.
224
225=item B<accessor($key)>
226
227=item B<accessor($key, $value)>
228
229If passed one argument, returns the value of the specified key. If passed two
230arguments, sets the value of the specified key.
231
232When called as a setter, this method returns the value that was set.
233
234=item B<shallow_clone>
235
236This method returns a shallow clone of the hash reference. The return value
237is a reference to a new hash with the same keys and values. It is I<shallow>
238because any values that were references in the original will be the I<same>
239references in the clone.
240
241=item B<_array_class>
242
243The name of the class which returned lists are instances of; i.e.
244C<< Data::Perl::Collection::Array >>.
245
246Subclasses of this class can override this method.
247
248=back
249
250Note that C<each> is deliberately omitted, due to its stateful interaction
251with the hash iterator. C<keys> or C<kv> are much safer.
252
253=head1 SEE ALSO
254
255=over 4
256
257=item * L<Data::Perl>
258
259=item * L<MooX::HandlesVia>
260
261=back
262
263=head1 AUTHOR
264
265Matthew Phillips <mattp@cpan.org>
266
267=head1 COPYRIGHT AND LICENSE
268
269This software is copyright (c) 2020 by Matthew Phillips <mattp@cpan.org>.
270
271This is free software; you can redistribute it and/or modify it under
272the same terms as the Perl 5 programming language system itself.
273
274=cut
275
276__END__