← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 15:33:55 2022
Reported on Wed Dec 14 15:40:04 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/JSON/Pointer.pm
StatementsExecuted 380420 statements in 723ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
4784611530ms833msMojo::JSON::Pointer::::_pointerMojo::JSON::Pointer::_pointer
4784632154ms987msMojo::JSON::Pointer::::getMojo::JSON::Pointer::get
152270µs108µsMojo::JSON::Pointer::::newMojo::JSON::Pointer::new
11127µs208µsMojo::JSON::Pointer::::BEGIN@2Mojo::JSON::Pointer::BEGIN@2
0000s0sMojo::JSON::Pointer::::containsMojo::JSON::Pointer::contains
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Mojo::JSON::Pointer;
22326µs2389µs
# spent 208µs (27+181) within Mojo::JSON::Pointer::BEGIN@2 which was called: # once (27µs+181µs) by Moo::_Utils::_require at line 2
use Mojo::Base -base;
# spent 208µs making 1 call to Mojo::JSON::Pointer::BEGIN@2 # spent 181µs making 1 call to Mojo::Base::import
3
412µs138µshas 'data';
# spent 38µs making 1 call to Mojo::JSON::Pointer::has
5
6sub contains { shift->_pointer(0, @_) }
747846118ms47846833ms
# spent 987ms (154+833) within Mojo::JSON::Pointer::get which was called 47846 times, avg 21µs/call: # 39123 times (124ms+628ms) by JSON::Schema::Modern::_fetch_from_uri at line 828 of JSON/Schema/Modern.pm, avg 19µs/call # 7758 times (25.1ms+149ms) by JSON::Schema::Modern::_fetch_from_uri at line 852 of JSON/Schema/Modern.pm, avg 22µs/call # 965 times (4.57ms+55.4ms) by JSON::Schema::Modern::Document::OpenAPI::traverse at line 161 of JSON/Schema/Modern/Document/OpenAPI.pm, avg 62µs/call
sub get { shift->_pointer(1, @_) }
# spent 833ms making 47846 calls to Mojo::JSON::Pointer::_pointer, avg 17µs/call
8
91567µs1538µs
# spent 108µs (70+38) within Mojo::JSON::Pointer::new which was called 15 times, avg 7µs/call: # 14 times (61µs+35µs) by JSON::Schema::Modern::Document::new at line 53 of (eval 424)[Sub/Quote.pm:3], avg 7µs/call # once (9µs+3µs) by JSON::Schema::Modern::Document::OpenAPI::new at line 56 of (eval 417)[Sub/Quote.pm:3]
sub new { @_ > 1 ? shift->SUPER::new(data => shift) : shift->SUPER::new }
# spent 38µs making 15 calls to Mojo::Base::new, avg 3µs/call
10
11
# spent 833ms (530+303) within Mojo::JSON::Pointer::_pointer which was called 47846 times, avg 17µs/call: # 47846 times (530ms+303ms) by Mojo::JSON::Pointer::get at line 7, avg 17µs/call
sub _pointer {
124784629.6ms my ($self, $get, $pointer) = @_;
13
144784670.4ms47846223ms my $data = $self->data;
# spent 223ms making 47846 calls to JSON::Schema::Modern::Document::data, avg 5µs/call
1547846181ms4784649.7ms return length $pointer ? undef : $get ? $data : 1 unless $pointer =~ s!^/!!;
# spent 49.7ms making 47846 calls to Mojo::JSON::Pointer::CORE:subst, avg 1µs/call
162036251.6ms for my $p (length $pointer ? (split /\//, $pointer, -1) : ($pointer)) {
174943188.2ms4943118.1ms $p =~ s!~1!/!g;
# spent 18.1ms making 49431 calls to Mojo::JSON::Pointer::CORE:subst, avg 365ns/call
184943154.4ms4943111.3ms $p =~ s/~0/~/g;
# spent 11.3ms making 49431 calls to Mojo::JSON::Pointer::CORE:subst, avg 229ns/call
19
20 # Hash
214943193.5ms211877µs if (ref $data eq 'HASH' && exists $data->{$p}) { $data = $data->{$p} }
# spent 877µs making 211 calls to Mojo::JSON::Pointer::CORE:match, avg 4µs/call
22
23 # Array
24 elsif (ref $data eq 'ARRAY' && $p =~ /^\d+$/ && @$data > $p) { $data = $data->[$p] }
25
26 # Nothing
27 else { return undef }
28 }
29
302036236.9ms return $get ? $data : 1;
31}
32
3312µs1;
34
35=encoding utf8
36
37=head1 NAME
38
39Mojo::JSON::Pointer - JSON Pointers
40
41=head1 SYNOPSIS
42
43 use Mojo::JSON::Pointer;
44
45 my $pointer = Mojo::JSON::Pointer->new({foo => [23, 'bar']});
46 say $pointer->get('/foo/1');
47 say 'Contains "/foo".' if $pointer->contains('/foo');
48
49=head1 DESCRIPTION
50
51L<Mojo::JSON::Pointer> is an implementation of L<RFC 6901|https://tools.ietf.org/html/rfc6901>.
52
53=head1 ATTRIBUTES
54
55L<Mojo::JSON::Pointer> implements the following attributes.
56
57=head2 data
58
59 my $data = $pointer->data;
60 $pointer = $pointer->data({foo => 'bar'});
61
62Data structure to be processed.
63
64=head1 METHODS
65
66L<Mojo::JSON::Pointer> inherits all methods from L<Mojo::Base> and implements the following new ones.
67
68=head2 contains
69
70 my $bool = $pointer->contains('/foo/1');
71
72Check if L</"data"> contains a value that can be identified with the given JSON Pointer.
73
74 # True
75 Mojo::JSON::Pointer->new('just a string')->contains('');
76 Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->contains('/♥');
77 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/foo');
78 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/1');
79
80 # False
81 Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->contains('/☃');
82 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/bar');
83 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/9');
84
85=head2 get
86
87 my $value = $pointer->get('/foo/bar');
88
89Extract value from L</"data"> identified by the given JSON Pointer.
90
91 # "just a string"
92 Mojo::JSON::Pointer->new('just a string')->get('');
93
94 # "mojolicious"
95 Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->get('/♥');
96
97 # "bar"
98 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/foo');
99
100 # "4"
101 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/0');
102
103 # "6"
104 Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/2');
105
106=head2 new
107
108 my $pointer = Mojo::JSON::Pointer->new;
109 my $pointer = Mojo::JSON::Pointer->new({foo => 'bar'});
110
111Build new L<Mojo::JSON::Pointer> object.
112
113=head1 SEE ALSO
114
115L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
116
117=cut