← Index
NYTProf Performance Profile   « line view »
For webmerge/scripts/webmerge.pl
  Run on Mon Oct 7 02:42:42 2013
Reported on Mon Oct 7 03:03:19 2013

Filename/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/Spritesets/Container.pm
StatementsExecuted 120785 statements in 2.90s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
10811654ms1.86sOCBNET::Spritesets::Container::::drawOCBNET::Spritesets::Container::draw
10822571ms3.94sOCBNET::Spritesets::Container::::layoutOCBNET::Spritesets::Container::layout
948811260ms428msOCBNET::Spritesets::Container::::lcmOCBNET::Spritesets::Container::lcm
31221222ms650msOCBNET::Spritesets::Container::::multilcmOCBNET::Spritesets::Container::multilcm
486862202ms592msOCBNET::Spritesets::Container::::scaleXOCBNET::Spritesets::Container::scaleX
486862183ms565msOCBNET::Spritesets::Container::::scaleYOCBNET::Spritesets::Container::scaleY
948811168ms168msOCBNET::Spritesets::Container::::gcfOCBNET::Spritesets::Container::gcf
49002298.3ms98.3msOCBNET::Spritesets::Container::::addOCBNET::Spritesets::Container::add
7367315.4ms15.4msOCBNET::Spritesets::Container::::childrenOCBNET::Spritesets::Container::children
168439.56ms142msOCBNET::Spritesets::Container::::newOCBNET::Spritesets::Container::new
528558.83ms8.83msOCBNET::Spritesets::Container::::emptyOCBNET::Spritesets::Container::empty
312215.16ms5.16msOCBNET::Spritesets::Container::::CORE:matchOCBNET::Spritesets::Container::CORE:match (opcode)
3211397µs397µsOCBNET::Spritesets::Container::::lengthOCBNET::Spritesets::Container::length
11190µs189µsOCBNET::Spritesets::Container::::BEGIN@11OCBNET::Spritesets::Container::BEGIN@11
11169µs346µsOCBNET::Spritesets::Container::::BEGIN@153OCBNET::Spritesets::Container::BEGIN@153
11153µs84µsOCBNET::Spritesets::Container::::BEGIN@12OCBNET::Spritesets::Container::BEGIN@12
11152µs486µsOCBNET::Spritesets::Container::::BEGIN@16OCBNET::Spritesets::Container::BEGIN@16
0000s0sOCBNET::Spritesets::Container::::multigcfOCBNET::Spritesets::Container::multigcf
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1###################################################################################################
2# Copyright 2013 by Marcel Greter
3# This file is part of Webmerge (GPL3)
4####################################################################################################
5# this is the base class for all children containers
6# it can be drawn (is a block) and can have child nodes
7####################################################################################################
8package OCBNET::Spritesets::Container;
9####################################################################################################
10
112151µs2289µs
# spent 189µs (90+99) within OCBNET::Spritesets::Container::BEGIN@11 which was called: # once (90µs+99µs) by base::import at line 11
use strict;
# spent 189µs making 1 call to OCBNET::Spritesets::Container::BEGIN@11 # spent 99µs making 1 call to strict::import
122159µs2116µs
# spent 84µs (53+32) within OCBNET::Spritesets::Container::BEGIN@12 which was called: # once (53µs+32µs) by base::import at line 12
use warnings;
# spent 84µs making 1 call to OCBNET::Spritesets::Container::BEGIN@12 # spent 32µs making 1 call to warnings::import
13
14####################################################################################################
15
1622.24ms2486µs
# spent 486µs (52+434) within OCBNET::Spritesets::Container::BEGIN@16 which was called: # once (52µs+434µs) by base::import at line 16
use base 'OCBNET::Spritesets::Block';
# spent 486µs making 1 call to OCBNET::Spritesets::Container::BEGIN@16 # spent 434µs making 1 call to base::import, recursion: max depth 1, sum of overlapping time 434µs
17
18####################################################################################################
19
20# try to optimize slow functions
21# with memoize oly if available
22# eval
23# {
24# # try to load
25# use Memoize qw(memoize);
26# # memoize functions
27# memoize('gcf', LIST_CACHE => 'MERGE');
28# memoize('lcm', LIST_CACHE => 'MERGE');
29# memoize('multigcf', LIST_CACHE => 'MERGE');
30# memoize('multilcm', LIST_CACHE => 'MERGE');
31# };
32
33####################################################################################################
34# stolen from http://www.perlmonks.org/?node_id=56906
35####################################################################################################
36
37# greatest common factor
38sub gcf($$)
39
# spent 168ms within OCBNET::Spritesets::Container::gcf which was called 9488 times, avg 18µs/call: # 9488 times (168ms+0s) by OCBNET::Spritesets::Container::lcm at line 48, avg 18µs/call
{
40948825.3ms my ($x, $y) = @_;
41948874.6ms ($x, $y) = ($y, $x % $y) while $y;
429488164ms return $x;
43}
44
45# least common multiple
46sub lcm($$)
47
# spent 428ms (260+168) within OCBNET::Spritesets::Container::lcm which was called 9488 times, avg 45µs/call: # 9488 times (260ms+168ms) by OCBNET::Spritesets::Container::multilcm at line 63, avg 45µs/call
{
489488279ms9488168ms return $_[0] * $_[1] / gcf($_[0], $_[1]);
# spent 168ms making 9488 calls to OCBNET::Spritesets::Container::gcf, avg 18µs/call
49}
50
51# greatest common factor
52sub multigcf(@)
53{
54 my $x = shift;
55 $x = gcf($x, shift) while @_;
56 return $x;
57}
58
59# least common multiple
60sub multilcm(@)
61
# spent 650ms (222+428) within OCBNET::Spritesets::Container::multilcm which was called 312 times, avg 2.08ms/call: # 156 times (131ms+196ms) by OCBNET::Spritesets::Container::scaleX at line 181, avg 2.10ms/call # 156 times (90.8ms+231ms) by OCBNET::Spritesets::Container::scaleY at line 194, avg 2.07ms/call
{
62312644µs my $x = shift;
63312103ms9488428ms $x = lcm($x, shift) while @_;
# spent 428ms making 9488 calls to OCBNET::Spritesets::Container::lcm, avg 45µs/call
643124.00ms return $x;
65}
66
67####################################################################################################
68
69# create a new object
70# called from children
71# ******************************************************************************
72sub new
73
# spent 142ms (9.56+133) within OCBNET::Spritesets::Container::new which was called 168 times, avg 848µs/call: # 96 times (5.32ms+7.10ms) by OCBNET::Spritesets::Stack::new at line 30 of webmerge/scripts/modules/OCBNET/Spritesets/Stack.pm, avg 129µs/call # 48 times (2.70ms+3.62ms) by OCBNET::Spritesets::Corner::new at line 29 of webmerge/scripts/modules/OCBNET/Spritesets/Corner.pm, avg 132µs/call # 12 times (848µs+121ms) by OCBNET::Spritesets::Canvas::new at line 59 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas.pm, avg 10.2ms/call # 12 times (692µs+950µs) by OCBNET::Spritesets::Canvas::new at line 78 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas.pm, avg 137µs/call
{
74
75168556µs my ($pckg, $parent) = @_;
76
771684.32ms168133ms my $self = $pckg->SUPER::new($parent);
# spent 133ms making 168 calls to OCBNET::Spritesets::Block::new, avg 791µs/call
78
79 # only for debugging purposes
80168785µs $self->{'bg'} = "xc:transparent";
81
82168617µs $self->{'children'} = [];
83
841683.21ms return bless $self, $pckg;
85
86}
87# EO sub new
88
89####################################################################################################
90
91# getter for all children in list context
92# ******************************************************************************
93# sub children { return @{$_[0]->{'children'}}; }
94
95####################################################################################################
96
97# add more children to this block
98# ******************************************************************************
99sub add
100
# spent 98.3ms within OCBNET::Spritesets::Container::add which was called 4900 times, avg 20µs/call: # 4744 times (95.7ms+0s) by OCBNET::Spritesets::Canvas::Distribute::distribute at line 133 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Distribute.pm, avg 20µs/call # 156 times (2.59ms+0s) by OCBNET::Spritesets::Canvas::new at line 122 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas.pm, avg 17µs/call
{
101
102490016.7ms my ($self, $child) = @_;
103
104 # add new child to our array
105490019.9ms push(@{$self->{'children'}}, $child);
106
107 # attach ourself as parent
10849009.42ms $child->{'parent'} = $self;
109
110 # return new number of children
111490096.8ms return scalar @{$self->{'children'}};
112
113}
114# EO sub add
115
116####################################################################################################
117
118# getter for all children in list context
119# ******************************************************************************
12073620.1ms
# spent 15.4ms within OCBNET::Spritesets::Container::children which was called 736 times, avg 21µs/call: # 156 times (3.04ms+0s) by OCBNET::Spritesets::Container::scaleY at line 192, avg 19µs/call # 156 times (2.92ms+0s) by OCBNET::Spritesets::Container::scaleX at line 179, avg 19µs/call # 108 times (3.07ms+0s) by OCBNET::Spritesets::Container::layout at line 157, avg 28µs/call # 96 times (1.37ms+0s) by OCBNET::Spritesets::Stack::layout at line 61 of webmerge/scripts/modules/OCBNET/Spritesets/Stack.pm, avg 14µs/call # 96 times (1.25ms+0s) by OCBNET::Spritesets::Stack::layout at line 111 of webmerge/scripts/modules/OCBNET/Spritesets/Stack.pm, avg 13µs/call # 76 times (3.08ms+0s) by OCBNET::Spritesets::Canvas::Repeater::repeater at line 59 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Repeater.pm, avg 41µs/call # 48 times (620µs+0s) by OCBNET::Spritesets::Stack::layout at line 157 of webmerge/scripts/modules/OCBNET/Spritesets/Stack.pm, avg 13µs/call
sub children { return @{$_[0]->{'children'}}; }
121
122# getter for number of childrens
123# ******************************************************************************
12432613µs
# spent 397µs within OCBNET::Spritesets::Container::length which was called 32 times, avg 12µs/call: # 32 times (397µs+0s) by OCBNET::Spritesets::Corner::layout at line 61 of webmerge/scripts/modules/OCBNET/Spritesets/Corner.pm, avg 12µs/call
sub length { return scalar @{$_[0]->{'children'}}; }
125
126####################################################################################################
127
128# check if this block is empty
129# ******************************************************************************
130sub empty
131
# spent 8.83ms within OCBNET::Spritesets::Container::empty which was called 528 times, avg 17µs/call: # 156 times (3.36ms+0s) by OCBNET::Spritesets::Canvas::draw at line 181 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas.pm, avg 22µs/call # 156 times (2.58ms+0s) by OCBNET::Spritesets::Canvas::Repeater::repeater at line 39 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Repeater.pm, avg 17µs/call # 156 times (2.02ms+0s) by OCBNET::Spritesets::Canvas::Layout::layout at line 383 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 13µs/call # 48 times (717µs+0s) by OCBNET::Spritesets::Corner::layout at line 58 of webmerge/scripts/modules/OCBNET/Spritesets/Corner.pm, avg 15µs/call # 12 times (154µs+0s) by OCBNET::Spritesets::Fit::layout at line 30 of webmerge/scripts/modules/OCBNET/Spritesets/Fit.pm, avg 13µs/call
{
132
133 # check if the number of children is zero
13452811.6ms return scalar @{$_[0]->{'children'}} == 0;
135
136}
137# EO sub empty
138
139####################################################################################################
140
141# layout all child nodes
142# updates dimensions and positions
143# ******************************************************************************
144sub layout
145
# spent 3.94s (571ms+3.36) within OCBNET::Spritesets::Container::layout which was called 108 times, avg 36.4ms/call: # 96 times (38.7ms+330ms) by OCBNET::Spritesets::Stack::layout at line 102 of webmerge/scripts/modules/OCBNET/Spritesets/Stack.pm, avg 3.84ms/call # 12 times (533ms+3.03s) by OCBNET::Spritesets::Fit::layout at line 32 of webmerge/scripts/modules/OCBNET/Spritesets/Fit.pm, avg 297ms/call
{
146
147 # get our object
148108341µs my ($self) = @_;
149
150 # layout all children
15110851.1ms47122.13s $_->layout foreach (@{$self->{'children'}});
# spent 2.13s making 4712 calls to OCBNET::Spritesets::Block::layout, avg 451µs/call
152
15322.50ms2623µs
# spent 346µs (69+277) within OCBNET::Spritesets::Container::BEGIN@153 which was called: # once (69µs+277µs) by base::import at line 153
use OCBNET::Spritesets::Canvas::Layout qw(snap);
# spent 346µs making 1 call to OCBNET::Spritesets::Container::BEGIN@153 # spent 277µs making 1 call to Exporter::import
154
155 # we scale by our common scale factor
156 # so this has to be here and not in block
1571082.78ms1083.07ms foreach my $sprite ($self->children)
# spent 3.07ms making 108 calls to OCBNET::Spritesets::Container::children, avg 28µs/call
158 {
159471289.6ms9424631ms snap ($sprite->{'width'}, $self->scaleX);
# spent 577ms making 4712 calls to OCBNET::Spritesets::Container::scaleX, avg 123µs/call # spent 54.0ms making 4712 calls to OCBNET::Spritesets::Canvas::Layout::snap, avg 11µs/call
1604712101ms9424604ms snap ($sprite->{'height'}, $self->scaleY);
# spent 552ms making 4712 calls to OCBNET::Spritesets::Container::scaleY, avg 117µs/call # spent 52.2ms making 4712 calls to OCBNET::Spritesets::Canvas::Layout::snap, avg 11µs/call
161
162 }
163
164 # return success
1651081.52ms return $self;
166
167}
168# EO sub layout
169
170
171####################################################################################################
172
173sub scaleX
174
# spent 592ms (202+390) within OCBNET::Spritesets::Container::scaleX which was called 4868 times, avg 122µs/call: # 4712 times (193ms+384ms) by OCBNET::Spritesets::Container::layout at line 159, avg 123µs/call # 48 times (3.49ms+2.60ms) by OCBNET::Spritesets::Canvas::Layout::layout at line 166 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 127µs/call # 48 times (3.12ms+2.33ms) by OCBNET::Spritesets::Canvas::Layout::layout at line 195 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 113µs/call # 36 times (1.18ms+257µs) by OCBNET::Spritesets::Canvas::Layout::layout at line 179 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 40µs/call # 12 times (469µs+124µs) by OCBNET::Spritesets::Canvas::Layout::layout at line 190 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 49µs/call # 12 times (460µs+121µs) by OCBNET::Spritesets::Canvas::Layout::layout at line 192 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 48µs/call
{
175486811.0ms my ($self) = @_;
176486815.3ms my @factors = (1);
1774868149ms if (defined $self->{'scale-x'})
178 { return $self->{'scale-x'}; }
1791563.06ms1562.92ms foreach my $sprite ($self->children)
# spent 2.92ms making 156 calls to OCBNET::Spritesets::Container::children, avg 19µs/call
180474461.4ms474456.4ms { push(@factors, $sprite->scaleX); }
# spent 56.4ms making 4744 calls to OCBNET::Spritesets::Sprite::scaleX, avg 12µs/call
1811561.76ms156328ms my $rv = multilcm(@factors);
# spent 328ms making 156 calls to OCBNET::Spritesets::Container::multilcm, avg 2.10ms/call
1821564.82ms1562.92ms die $rv unless $rv =~ m/^\d+$/;
# spent 2.92ms making 156 calls to OCBNET::Spritesets::Container::CORE:match, avg 19µs/call
1831566.16ms return $self->{'scale-x'} = $rv;
184}
185
186sub scaleY
187
# spent 565ms (183+382) within OCBNET::Spritesets::Container::scaleY which was called 4868 times, avg 116µs/call: # 4712 times (175ms+377ms) by OCBNET::Spritesets::Container::layout at line 160, avg 117µs/call # 48 times (3.00ms+2.27ms) by OCBNET::Spritesets::Canvas::Layout::layout at line 172 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 110µs/call # 48 times (2.88ms+2.20ms) by OCBNET::Spritesets::Canvas::Layout::layout at line 202 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 106µs/call # 36 times (1.10ms+241µs) by OCBNET::Spritesets::Canvas::Layout::layout at line 184 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 37µs/call # 12 times (437µs+123µs) by OCBNET::Spritesets::Canvas::Layout::layout at line 191 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 47µs/call # 12 times (438µs+120µs) by OCBNET::Spritesets::Canvas::Layout::layout at line 193 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Layout.pm, avg 47µs/call
{
188486810.6ms my ($self) = @_;
189486815.3ms my @factors = (1);
1904868153ms if (defined $self->{'scale-y'})
191 { return $self->{'scale-y'}; }
1921562.95ms1563.04ms foreach my $sprite ($self->children)
# spent 3.04ms making 156 calls to OCBNET::Spritesets::Container::children, avg 19µs/call
193474460.1ms474454.6ms { push(@factors, $sprite->scaleY); }
# spent 54.6ms making 4744 calls to OCBNET::Spritesets::Sprite::scaleY, avg 12µs/call
1941561.60ms156322ms my $rv = multilcm(@factors);
# spent 322ms making 156 calls to OCBNET::Spritesets::Container::multilcm, avg 2.07ms/call
1951564.07ms1562.24ms die $rv unless $rv =~ m/^\d+$/;
# spent 2.24ms making 156 calls to OCBNET::Spritesets::Container::CORE:match, avg 14µs/call
1961564.91ms return $self->{'scale-y'} = $rv;
197}
198
199####################################################################################################
200
201# draw and return image instance
202# ******************************************************************************
203sub draw
204
# spent 1.86s (654ms+1.21) within OCBNET::Spritesets::Container::draw which was called 108 times, avg 17.2ms/call: # 108 times (654ms+1.21s) by OCBNET::Spritesets::Canvas::draw at line 203 of webmerge/scripts/modules/OCBNET/Spritesets/Canvas.pm, avg 17.2ms/call
{
205
206 # get our object
207108453µs my ($self) = @_;
208
209 # initialize empty image
21010811.6ms1089.17ms $self->{'image'}->Set(matte => 'True');
# spent 9.17ms making 108 calls to Graphics::Magick::Set, avg 85µs/call
2111085.13ms1083.17ms $self->{'image'}->Set(magick => 'png');
# spent 3.17ms making 108 calls to Graphics::Magick::Set, avg 29µs/call
2121087.00ms21612.4ms $self->{'image'}->Set(size => $self->size);
# spent 8.62ms making 108 calls to OCBNET::Spritesets::Block::size, avg 80µs/call # spent 3.78ms making 108 calls to Graphics::Magick::Set, avg 35µs/call
21310878.5ms10875.2ms $self->{'image'}->ReadImage($self->{'bg'});
# spent 75.2ms making 108 calls to Graphics::Magick::ReadImage, avg 697µs/call
214108106ms108103ms $self->{'image'}->Quantize(colorspace=>'RGB');
# spent 103ms making 108 calls to Graphics::Magick::Quantize, avg 951µs/call
215
216 # process all sprites to paint them
2171081.38ms foreach my $sprite (@{$self->{'children'}})
218 {
219 # draw background on canvas
220474414.6ms if ($sprite->{'bg'})
221 {
222 $self->{'image'}->Composite(
223 compose => 'over',
224 y => $sprite->top + $sprite->paddingTop,
225 x => $sprite->left + $sprite->paddingLeft,
226 image => $sprite->{'img-bg'}
227 );
228 }
229 # draw image on canvas
23047441.08s284641.00s $self->{'image'}->Composite(
# spent 755ms making 4744 calls to Graphics::Magick::Composite, avg 159µs/call # spent 55.0ms making 4744 calls to OCBNET::Spritesets::Block::top, avg 12µs/call # spent 50.6ms making 4744 calls to OCBNET::Spritesets::Block::draw, avg 11µs/call # spent 48.2ms making 4744 calls to OCBNET::Spritesets::Block::paddingTop, avg 10µs/call # spent 47.3ms making 4744 calls to OCBNET::Spritesets::Block::paddingLeft, avg 10µs/call # spent 46.6ms making 4744 calls to OCBNET::Spritesets::Block::left, avg 10µs/call
231 compose => 'over',
232 y => $sprite->top + $sprite->paddingTop,
233 x => $sprite->left + $sprite->paddingLeft,
234 image => $sprite->draw
235 );
236 }
237 # EO each sprite
238
239 # return the image instance
2401082.43ms return $self->{'image'};
241
242}
243# EO sub draw
244
245####################################################################################################
246####################################################################################################
247114µs1;
 
# spent 5.16ms within OCBNET::Spritesets::Container::CORE:match which was called 312 times, avg 17µs/call: # 156 times (2.92ms+0s) by OCBNET::Spritesets::Container::scaleX at line 182, avg 19µs/call # 156 times (2.24ms+0s) by OCBNET::Spritesets::Container::scaleY at line 195, avg 14µs/call
sub OCBNET::Spritesets::Container::CORE:match; # opcode