Profile of lib/PONAPI/Builder/Resource.pm

← Index
NYTProf Performance Profile «line view»
For script/ponapi
Run on Wed Feb 10 15:51:26 2016
Reported on Thu Feb 11 09:43:11 2016

Filename | /home/mickey/git_tree/PONAPI/Server/lib/PONAPI/Builder/Resource.pm
Statements | Executed 17602241 statements in 37.0s

Subroutines
Calls | P | F | Exclusive Time | Inclusive Time | Subroutine
--- | --- | --- | --- | --- | ---
607534 | 4 | 2 | 41.7s | 125s | PONAPI::Builder::Resource::::buildPONAPI::Builder::Resource::build
823661 | 2 | 2 | 8.27s | 25.4s | PONAPI::Builder::Resource::::add_attributePONAPI::Builder::Resource::add_attribute
172883 | 1 | 1 | 5.52s | 60.9s | PONAPI::Builder::Resource::::add_relationshipPONAPI::Builder::Resource::add_relationship
270247 | 2 | 1 | 5.41s | 60.4s | PONAPI::Builder::Resource::::add_self_linkPONAPI::Builder::Resource::add_self_link
86592 | 1 | 1 | 2.12s | 11.2s | PONAPI::Builder::Resource::::add_attributesPONAPI::Builder::Resource::add_attributes
270247 | 1 | 1 | 509ms | 509ms | PONAPI::Builder::Resource::::__ANON__[lib/PONAPI/Builder/Resource.pm:38]PONAPI::Builder::Resource::__ANON__[lib/PONAPI/Builder/Resource.pm:38]
270247 | 1 | 1 | 452ms | 452ms | PONAPI::Builder::Resource::::__ANON__[lib/PONAPI/Builder/Resource.pm:21]PONAPI::Builder::Resource::__ANON__[lib/PONAPI/Builder/Resource.pm:21]
1 | 1 | 1 | 627µs | 370ms | PONAPI::Builder::Resource::::BEGIN@6PONAPI::Builder::Resource::BEGIN@6
1 | 1 | 1 | 15µs | 7.08ms | PONAPI::Builder::Resource::::BEGIN@4PONAPI::Builder::Resource::BEGIN@4
1 | 1 | 1 | 12µs | 96µs | PONAPI::Builder::Resource::::BEGIN@131PONAPI::Builder::Resource::BEGIN@131

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

Line | State ments | Time on line | Calls | Time in subs | Code
--- | --- | --- | --- | --- | ---
1 |  |  |  |  | # ABSTRACT: document builder - resource
2 |  |  |  |  | package PONAPI::Builder::Resource;
3 |  |  |  |  |
4 | 2 | 47µs | 2 | 14.1ms | # spent 7.08ms (15µs+7.06) within PONAPI::Builder::Resource::BEGIN@4 which was called: # once (15µs+7.06ms) by PONAPI::Builder::Document::BEGIN@6 at line 4 use Moose; # spent 7.08ms making 1 call to PONAPI::Builder::Resource::BEGIN@4 # spent 7.06ms making 1 call to Moose::import
5 |  |  |  |  |
6 | 2 | 625µs | 1 | 370ms | # spent 370ms (627µs+369) within PONAPI::Builder::Resource::BEGIN@6 which was called: # once (627µs+369ms) by PONAPI::Builder::Document::BEGIN@6 at line 6 use PONAPI::Builder::Relationship; # spent 370ms making 1 call to PONAPI::Builder::Resource::BEGIN@6
7 |  |  |  |  |
8 | 1 | 3µs | 1 | 11.3ms | with 'PONAPI::Builder', # spent 11.3ms making 1 call to Moose::with
9 |  |  |  |  | 'PONAPI::Builder::Role::HasLinksBuilder',
10 |  |  |  |  | 'PONAPI::Builder::Role::HasMeta';
11 |  |  |  |  |
12 | 1 | 2µs | 1 | 1.38ms | has id => ( is => 'ro', isa => 'Str', required => 1 ); # spent 1.38ms making 1 call to Moose::has
13 | 1 | 2µs | 1 | 1.21ms | has type => ( is => 'ro', isa => 'Str', required => 1 ); # spent 1.21ms making 1 call to Moose::has
14 |  |  |  |  |
15 |  |  |  |  | has _attributes => (
16 |  |  |  |  | init_arg => undef,
17 |  |  |  |  | traits => [ 'Hash' ],
18 |  |  |  |  | is => 'ro',
19 |  |  |  |  | isa => 'HashRef',
20 |  |  |  |  | lazy => 1,
21 | 270247 | 1.50s |  |  | # spent 452ms within PONAPI::Builder::Resource::__ANON__[lib/PONAPI/Builder/Resource.pm:21] which was called 270247 times, avg 2µs/call: # 270247 times (452ms+0s) by PONAPI::Builder::Resource::_add_attribute at line 24 of (eval 45)[Eval/Closure.pm:144], avg 2µs/call default => sub { +{} },
22 | 1 | 9µs | 1 | 13.4ms | handles => { # spent 13.4ms making 1 call to Moose::has
23 |  |  |  |  | 'has_attributes' => 'count',
24 |  |  |  |  | 'has_attribute_for' => 'exists',
25 |  |  |  |  | # private ...
26 |  |  |  |  | '_add_attribute' => 'set',
27 |  |  |  |  | '_get_attribute' => 'get',
28 |  |  |  |  | '_keys_attributes' => 'keys',
29 |  |  |  |  | }
30 |  |  |  |  | );
31 |  |  |  |  |
32 |  |  |  |  | has _relationships => (
33 |  |  |  |  | init_arg => undef,
34 |  |  |  |  | traits => [ 'Hash' ],
35 |  |  |  |  | is => 'ro',
36 |  |  |  |  | isa => 'HashRef[ PONAPI::Builder::Relationship ]',
37 |  |  |  |  | lazy => 1,
38 | 270247 | 1.58s |  |  | # spent 509ms within PONAPI::Builder::Resource::__ANON__[lib/PONAPI/Builder/Resource.pm:38] which was called 270247 times, avg 2µs/call: # 270247 times (509ms+0s) by PONAPI::Builder::Resource::has_relationship_for at line 20 of (eval 45)[Eval/Closure.pm:144], avg 2µs/call default => sub { +{} },
39 | 1 | 10µs | 1 | 21.1ms | handles => { # spent 21.1ms making 1 call to Moose::has
40 |  |  |  |  | 'has_relationships' => 'count',
41 |  |  |  |  | 'has_relationship_for' => 'exists',
42 |  |  |  |  | # private ...
43 |  |  |  |  | '_add_relationship' => 'set',
44 |  |  |  |  | '_get_relationship' => 'get',
45 |  |  |  |  | '_keys_relationships' => 'keys',
46 |  |  |  |  | }
47 |  |  |  |  | );
48 |  |  |  |  |
49 |  |  |  |  | # spent 25.4s (8.27+17.1) within PONAPI::Builder::Resource::add_attribute which was called 823661 times, avg 31µs/call: # 468303 times (4.90s+11.3s) by Test::PONAPI::Repository::MockDB::_add_resources at line 564 of lib/Test/PONAPI/Repository/MockDB.pm, avg 35µs/call # 355358 times (3.36s+5.76s) by PONAPI::Builder::Resource::add_attributes at line 63, avg 26µs/call sub add_attribute {
50 | 823661 | 388ms |  |  | my ( $self, $key, $value ) = @_;
51 |  |  |  |  |
52 | 823661 | 904ms | 823661 | 7.44s | $self->raise_error( 400, # spent 7.44s making 823661 calls to PONAPI::Builder::Resource::has_relationship_for, avg 9µs/call
53 |  |  |  |  | title => 'Attribute key conflict, a relation already exists for key: ' . $key
54 |  |  |  |  | ) if $self->has_relationship_for( $key );
55 |  |  |  |  |
56 | 823661 | 1.09s | 823661 | 9.64s | $self->_add_attribute( $key, $value ); # spent 9.64s making 823661 calls to PONAPI::Builder::Resource::_add_attribute, avg 12µs/call
57 |  |  |  |  |
58 | 823661 | 3.16s |  |  | return $self;
59 |  |  |  |  | }
60 |  |  |  |  |
61 |  |  |  |  | # spent 11.2s (2.12+9.12) within PONAPI::Builder::Resource::add_attributes which was called 86592 times, avg 130µs/call: # 86592 times (2.12s+9.12s) by Test::PONAPI::Repository::MockDB::_add_included at line 686 of lib/Test/PONAPI/Repository/MockDB.pm, avg 130µs/call sub add_attributes {
62 | 86592 | 160ms |  |  | my ( $self, %args ) = @_;
63 | 86592 | 686ms | 355358 | 9.12s | $self->add_attribute( $_, $args{ $_ } ) foreach keys %args; # spent 9.12s making 355358 calls to PONAPI::Builder::Resource::add_attribute, avg 26µs/call
64 | 86592 | 402ms |  |  | return $self;
65 |  |  |  |  | }
66 |  |  |  |  |
67 |  |  |  |  | # spent 60.9s (5.52+55.4) within PONAPI::Builder::Resource::add_relationship which was called 172883 times, avg 352µs/call: # 172883 times (5.52s+55.4s) by Test::PONAPI::Repository::MockDB::_add_resource_relationships at line 653 of lib/Test/PONAPI/Repository/MockDB.pm, avg 352µs/call sub add_relationship {
68 | 172883 | 119ms |  |  | my ( $self, $key, $resource, $collection ) = @_;
69 |  |  |  |  |
70 | 172883 | 413ms | 172883 | 832ms | $self->raise_error( 400, # spent 832ms making 172883 calls to PONAPI::Builder::Resource::has_attribute_for, avg 5µs/call
71 |  |  |  |  | title => 'Relationship key conflict, an attribute already exists for key: ' . $key
72 |  |  |  |  | ) if $self->has_attribute_for( $key );
73 |  |  |  |  |
74 | 172883 | 329ms |  |  | my @resources =
75 |  |  |  |  | ( ref $resource eq 'ARRAY' ) ? @$resource :
76 |  |  |  |  | ( ref $resource eq 'HASH' ) ? $resource :
77 |  |  |  |  | die 'Relationship resource information must be a reference (HASH or ARRAY)';
78 |  |  |  |  |
79 | 172883 | 1.07s | 345766 | 22.0s | my $builder = $self->has_relationship_for($key) # spent 21.4s making 158776 calls to PONAPI::Builder::Relationship::new, avg 135µs/call # spent 555ms making 172883 calls to PONAPI::Builder::Resource::has_relationship_for, avg 3µs/call # spent 38.6ms making 14107 calls to PONAPI::Builder::Resource::_get_relationship, avg 3µs/call
80 |  |  |  |  | ? $self->_get_relationship($key)
81 |  |  |  |  | : PONAPI::Builder::Relationship->new(
82 |  |  |  |  | parent => $self,
83 |  |  |  |  | name => $key,
84 |  |  |  |  | collection => $collection,
85 |  |  |  |  | );
86 |  |  |  |  |
87 | 172883 | 587ms | 172883 | 28.4s | $builder->add_resource( $_ ) foreach @resources; # spent 28.4s making 172883 calls to PONAPI::Builder::Relationship::add_resource, avg 164µs/call
88 |  |  |  |  |
89 | 172883 | 1.31s | 172883 | 4.19s | $self->_add_relationship( $key => $builder ); # spent 4.19s making 172883 calls to PONAPI::Builder::Resource::_add_relationship, avg 24µs/call
90 |  |  |  |  | }
91 |  |  |  |  |
92 |  |  |  |  | # spent 60.4s (5.41+55.0) within PONAPI::Builder::Resource::add_self_link which was called 270247 times, avg 224µs/call: # 183655 times (3.84s+39.3s) by Test::PONAPI::Repository::MockDB::_add_resources at line 565 of lib/Test/PONAPI/Repository/MockDB.pm, avg 235µs/call # 86592 times (1.57s+15.7s) by Test::PONAPI::Repository::MockDB::_add_included at line 686 of lib/Test/PONAPI/Repository/MockDB.pm, avg 199µs/call sub add_self_link {
93 | 270247 | 84.1ms |  |  | my $self = shift;
94 | 270247 | 961ms | 540494 | 8.43s | my $base = $self->find_root->req_base; # spent 7.86s making 270247 calls to PONAPI::Builder::find_root, avg 29µs/call # spent 572ms making 270247 calls to PONAPI::Builder::Document::req_base, avg 2µs/call
95 | 270247 | 1.24s | 540494 | 46.6s | $self->links_builder->add_link( self => $base . $self->{type} . '/' . $self->{id} ); # spent 39.3s making 270247 calls to PONAPI::Builder::Resource::links_builder, avg 146µs/call # spent 7.23s making 270247 calls to PONAPI::Builder::Links::add_link, avg 27µs/call
96 | 270247 | 1.21s |  |  | return $self;
97 |  |  |  |  | }
98 |  |  |  |  |
99 |  |  |  |  | # spent 125s (41.7+83.0) within PONAPI::Builder::Resource::build which was called 607534 times, avg 205µs/call: # 345766 times (25.7s+56.0s) by PONAPI::Builder::Relationship::_add_relationship_link at line 61 of lib/PONAPI/Builder/Relationship.pm, avg 236µs/call # 133899 times (8.30s+16.7s) by PONAPI::Builder::Document::build at line 155 of lib/PONAPI/Builder/Document.pm, avg 187µs/call # 78113 times (4.27s+3.05s) by PONAPI::Builder::Document::build at line 174 of lib/PONAPI/Builder/Document.pm, avg 94µs/call # 49756 times (3.47s+7.23s) by PONAPI::Builder::Document::build at line 160 of lib/PONAPI/Builder/Document.pm, avg 215µs/call sub build {
100 | 607534 | 179ms |  |  | my $self = shift;
101 | 607534 | 325ms |  |  | my %args = @_;
102 | 607534 | 252ms |  |  | my $result = {};
103 |  |  |  |  |
104 | 607534 | 1.09s | 607534 | 917ms | $result->{id} = $self->id; # spent 917ms making 607534 calls to PONAPI::Builder::Resource::id, avg 2µs/call
105 | 607534 | 976ms | 607534 | 985ms | $result->{type} = $self->type; # spent 985ms making 607534 calls to PONAPI::Builder::Resource::type, avg 2µs/call
106 | 607534 | 2.33s | 1822602 | 15.7s | $result->{links} = $self->links_builder->build if $self->has_links_builder; # spent 13.8s making 607534 calls to PONAPI::Builder::Links::build, avg 23µs/call # spent 1.08s making 607534 calls to PONAPI::Builder::Resource::links_builder, avg 2µs/call # spent 796ms making 607534 calls to PONAPI::Builder::Resource::has_links_builder, avg 1µs/call
107 | 607534 | 911ms | 607534 | 1.28s | $result->{meta} = $self->_meta if $self->has_meta; # spent 1.28s making 607534 calls to PONAPI::Builder::Resource::has_meta, avg 2µs/call
108 |  |  |  |  |
109 |  |  |  |  | # support filtered output for attributes/relationships through args
110 | 607534 | 115ms |  |  | my @field_filters;
111 | 607534 | 228ms |  |  | @field_filters = @{ $args{fields}{ $self->type } }
112 |  |  |  |  | if exists $args{fields} and exists $args{fields}{ $self->type };
113 |  |  |  |  |
114 | 607534 | 1.15s | 607534 | 1.60s | if ( $self->has_attributes ) { # spent 1.60s making 607534 calls to PONAPI::Builder::Resource::has_attributes, avg 3µs/call
115 |  |  |  |  | my @attributes = @field_filters
116 | 607534 | 1.51s | 607534 | 1.62s | ? grep { $self->has_attribute_for($_) } @field_filters # spent 1.62s making 607534 calls to PONAPI::Builder::Resource::_keys_attributes, avg 3µs/call
117 |  |  |  |  | : $self->_keys_attributes;
118 |  |  |  |  |
119 | 2405374 | 3.98s | 1797840 | 5.19s | $result->{attributes} = +{ map { $_ => $self->_get_attribute($_) } @attributes }; # spent 5.19s making 1797840 calls to PONAPI::Builder::Resource::_get_attribute, avg 3µs/call
120 |  |  |  |  | }
121 |  |  |  |  |
122 | 542856 | 801ms | 542856 | 2.15s | $result->{relationships} = +{ # spent 2.15s making 542856 calls to PONAPI::Builder::Resource::_get_relationship, avg 4µs/call
123 | 1150390 | 3.43s | 1642191 | 53.5s | map { my $v = $self->_get_relationship($_); $v ? ( $_ => $v->build ) : () } # spent 50.7s making 542856 calls to PONAPI::Builder::Relationship::build, avg 93µs/call # spent 1.53s making 607534 calls to PONAPI::Builder::Resource::has_relationships, avg 3µs/call # spent 1.33s making 491801 calls to PONAPI::Builder::Resource::_keys_relationships, avg 3µs/call
124 |  |  |  |  | ( @field_filters ? @field_filters : $self->_keys_relationships )
125 |  |  |  |  | } if $self->has_relationships;
126 |  |  |  |  |
127 | 607534 | 2.48s |  |  | return $result;
128 |  |  |  |  | }
129 |  |  |  |  |
130 | 1 | 6µs | 2 | 9.12ms | __PACKAGE__->meta->make_immutable; # spent 9.10ms making 1 call to Class::MOP::Class::make_immutable # spent 22µs making 1 call to PONAPI::Builder::Resource::meta
131 | 3 | 69µs | 2 | 180µs | # spent 96µs (12+84) within PONAPI::Builder::Resource::BEGIN@131 which was called: # once (12µs+84µs) by PONAPI::Builder::Document::BEGIN@6 at line 131 no Moose; 1; # spent 96µs making 1 call to PONAPI::Builder::Resource::BEGIN@131 # spent 84µs making 1 call to Moose::unimport
132 |  |  |  |  |
133 |  |  |  |  | __END__