← Index
NYTProf Performance Profile   « line view »
For rbm/rbm
  Run on Wed Feb 12 20:36:06 2020
Reported on Wed Feb 12 21:42:27 2020

Filename/usr/lib/x86_64-linux-gnu/perl5/5.28/Template/Iterator.pm
StatementsExecuted 306916 statements in 876ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
2535341378ms378msTemplate::Iterator::::get_nextTemplate::Iterator::get_next
524811107ms116msTemplate::Iterator::::newTemplate::Iterator::new
52484195.7ms95.7msTemplate::Iterator::::get_firstTemplate::Iterator::get_first
52484156.4ms77.2msTemplate::Iterator::::AUTOLOADTemplate::Iterator::AUTOLOAD
52481120.9ms20.9msTemplate::Iterator::::CORE:substTemplate::Iterator::CORE:subst (opcode)
1991116.96ms6.96msTemplate::Iterator::::CORE:sortTemplate::Iterator::CORE:sort (opcode)
11118µs25µsTemplate::Iterator::::BEGIN@24Template::Iterator::BEGIN@24
11114µs57µsTemplate::Iterator::::BEGIN@27Template::Iterator::BEGIN@27
11114µs14µsTemplate::Iterator::::BEGIN@28Template::Iterator::BEGIN@28
11113µs122µsTemplate::Iterator::::BEGIN@26Template::Iterator::BEGIN@26
11111µs58µsTemplate::Iterator::::BEGIN@25Template::Iterator::BEGIN@25
11110µs46µsTemplate::Iterator::::BEGIN@29Template::Iterator::BEGIN@29
1119µs108µsTemplate::Iterator::::BEGIN@31Template::Iterator::BEGIN@31
1115µs70µsTemplate::Iterator::::BEGIN@32Template::Iterator::BEGIN@32
111500ns500nsTemplate::Iterator::::__ANON__Template::Iterator::__ANON__ (xsub)
0000s0sTemplate::Iterator::::_dumpTemplate::Iterator::_dump
0000s0sTemplate::Iterator::::evenTemplate::Iterator::even
0000s0sTemplate::Iterator::::get_allTemplate::Iterator::get_all
0000s0sTemplate::Iterator::::oddTemplate::Iterator::odd
0000s0sTemplate::Iterator::::parityTemplate::Iterator::parity
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1#============================================================= -*-Perl-*-
2#
3# Template::Iterator
4#
5# DESCRIPTION
6#
7# Module defining an iterator class which is used by the FOREACH
8# directive for iterating through data sets. This may be
9# sub-classed to define more specific iterator types.
10#
11# AUTHOR
12# Andy Wardley <abw@wardley.org>
13#
14# COPYRIGHT
15# Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
16#
17# This module is free software; you can redistribute it and/or
18# modify it under the same terms as Perl itself.
19#
20#============================================================================
21
22package Template::Iterator;
23
24234µs232µs
# spent 25µs (18+7) within Template::Iterator::BEGIN@24 which was called: # once (18µs+7µs) by Template::Config::load at line 24
use strict;
# spent 25µs making 1 call to Template::Iterator::BEGIN@24 # spent 7µs making 1 call to strict::import
25236µs2104µs
# spent 58µs (11+46) within Template::Iterator::BEGIN@25 which was called: # once (11µs+46µs) by Template::Config::load at line 25
use warnings;
# spent 58µs making 1 call to Template::Iterator::BEGIN@25 # spent 46µs making 1 call to warnings::import
26232µs2232µs
# spent 122µs (13+110) within Template::Iterator::BEGIN@26 which was called: # once (13µs+110µs) by Template::Config::load at line 26
use base 'Template::Base';
# spent 122µs making 1 call to Template::Iterator::BEGIN@26 # spent 110µs making 1 call to base::import
27231µs2101µs
# spent 57µs (14+44) within Template::Iterator::BEGIN@27 which was called: # once (14µs+44µs) by Template::Config::load at line 27
use Template::Constants;
# spent 57µs making 1 call to Template::Iterator::BEGIN@27 # spent 44µs making 1 call to Exporter::import
28235µs215µs
# spent 14µs (14+500ns) within Template::Iterator::BEGIN@28 which was called: # once (14µs+500ns) by Template::Config::load at line 28
use Template::Exception;
# spent 14µs making 1 call to Template::Iterator::BEGIN@28 # spent 500ns making 1 call to Template::Iterator::__ANON__
29228µs283µs
# spent 46µs (10+37) within Template::Iterator::BEGIN@29 which was called: # once (10µs+37µs) by Template::Config::load at line 29
use Scalar::Util qw(blessed);
# spent 46µs making 1 call to Template::Iterator::BEGIN@29 # spent 37µs making 1 call to Exporter::import
30
31231µs2207µs
# spent 108µs (9+99) within Template::Iterator::BEGIN@31 which was called: # once (9µs+99µs) by Template::Config::load at line 31
use constant ODD => 'odd';
# spent 108µs making 1 call to Template::Iterator::BEGIN@31 # spent 99µs making 1 call to constant::import
322805µs2136µs
# spent 70µs (5+65) within Template::Iterator::BEGIN@32 which was called: # once (5µs+65µs) by Template::Config::load at line 32
use constant EVEN => 'even';
# spent 70µs making 1 call to Template::Iterator::BEGIN@32 # spent 65µs making 1 call to constant::import
33
341300nsour $VERSION = 2.68;
351300nsour $DEBUG = 0 unless defined $DEBUG;
36our $AUTOLOAD;
37
38#========================================================================
39# ----- CLASS METHODS -----
40#========================================================================
41
42#------------------------------------------------------------------------
43# new(\@target, \%options)
44#
45# Constructor method which creates and returns a reference to a new
46# Template::Iterator object. A reference to the target data (array
47# or hash) may be passed for the object to iterate through.
48#------------------------------------------------------------------------
49
50
# spent 116ms (107+9.66) within Template::Iterator::new which was called 5248 times, avg 22µs/call: # 5248 times (107ms+9.66ms) by Template::Config::iterator at line 177 of Template/Config.pm, avg 22µs/call
sub new {
5152484.09ms my $class = shift;
5252484.18ms my $data = shift || [ ];
5352484.01ms my $params = shift || { };
54
55524874.5ms52489.66ms if (ref $data eq 'HASH') {
# spent 6.96ms making 1991 calls to Template::Iterator::CORE:sort, avg 3µs/call # spent 2.70ms making 3257 calls to Scalar::Util::blessed, avg 828ns/call
56 # map a hash into a list of { key => ???, value => ??? } hashes,
57 # one for each key, sorted by keys
58 $data = [ map { { key => $_, value => $data->{ $_ } } }
59 sort keys %$data ];
60 }
61 elsif (blessed($data) && $data->can('as_list')) {
62 $data = $data->as_list();
63 }
64 elsif (ref $data ne 'ARRAY') {
65 # coerce any non-list data into an array reference
66 $data = [ $data ] ;
67 }
68
69 bless {
70524854.8ms _DATA => $data,
71 _ERROR => '',
72 }, $class;
73}
74
75
76#========================================================================
77# ----- PUBLIC OBJECT METHODS -----
78#========================================================================
79
80#------------------------------------------------------------------------
81# get_first()
82#
83# Initialises the object for iterating through the target data set. The
84# first record is returned, if defined, along with the STATUS_OK value.
85# If there is no target data, or the data is an empty set, then undef
86# is returned with the STATUS_DONE value.
87#------------------------------------------------------------------------
88
89
# spent 95.7ms within Template::Iterator::get_first which was called 5248 times, avg 18µs/call: # 1991 times (38.6ms+0s) by Template::Document::__ANON__[input text:22] at line 15 of /root/tor-browser-build/input text, avg 19µs/call # 1991 times (37.5ms+0s) by Template::Document::__ANON__[input text:43] at line 22 of /root/tor-browser-build/input text, avg 19µs/call # 993 times (14.3ms+0s) by Template::Document::__ANON__[input text:35] at line 20 of /root/tor-browser-build/input text, avg 14µs/call # 273 times (5.33ms+0s) by Template::Document::__ANON__[input text:35] at line 32 of /root/tor-browser-build/input text, avg 20µs/call
sub get_first {
9052482.83ms my $self = shift;
9152484.72ms my $data = $self->{ _DATA };
92
93524810.0ms $self->{ _DATASET } = $self->{ _DATA };
9452484.84ms my $size = scalar @$data;
9552482.30ms my $index = 0;
96
9752485.48ms return (undef, Template::Constants::STATUS_DONE) unless $size;
98
99 # initialise various counters, flags, etc.
100477737.9ms @$self{ qw( SIZE MAX INDEX COUNT FIRST LAST ) }
101 = ( $size, $size - 1, $index, 1, 1, $size > 1 ? 0 : 1, undef );
102477718.3ms @$self{ qw( PREV NEXT ) } = ( undef, $self->{ _DATASET }->[ $index + 1 ]);
103
104477726.3ms return $self->{ _DATASET }->[ $index ];
105}
106
- -
109#------------------------------------------------------------------------
110# get_next()
111#
112# Called repeatedly to access successive elements in the data set.
113# Should only be called after calling get_first() or a warning will
114# be raised and (undef, STATUS_DONE) returned.
115#------------------------------------------------------------------------
116
117
# spent 378ms within Template::Iterator::get_next which was called 25353 times, avg 15µs/call: # 19910 times (331ms+0s) by Template::Document::__ANON__[input text:43] at line 14 of /root/tor-browser-build/input text, avg 17µs/call # 3982 times (30.2ms+0s) by Template::Document::__ANON__[input text:22] at line 5 of /root/tor-browser-build/input text, avg 8µs/call # 981 times (13.7ms+0s) by Template::Document::__ANON__[input text:35] at line 10 of /root/tor-browser-build/input text, avg 14µs/call # 480 times (3.58ms+0s) by Template::Document::__ANON__[input text:35] at line 22 of /root/tor-browser-build/input text, avg 7µs/call
sub get_next {
1182535314.2ms my $self = shift;
1192535343.9ms my ($max, $index) = @$self{ qw( MAX INDEX ) };
1202535336.9ms my $data = $self->{ _DATASET };
121
122 # warn about incorrect usage
1232535320.2ms unless (defined $index) {
124 my ($pack, $file, $line) = caller();
125 warn("iterator get_next() called before get_first() at $file line $line\n");
126 return (undef, Template::Constants::STATUS_DONE); ## RETURN ##
127 }
128
129 # if there's still some data to go...
1302535320.4ms if ($index < $max) {
131 # update counters and flags
132205768.15ms $index++;
1332057676.2ms @$self{ qw( INDEX COUNT FIRST LAST ) }
134 = ( $index, $index + 1, 0, $index == $max ? 1 : 0 );
1352057670.0ms @$self{ qw( PREV NEXT ) } = @$data[ $index - 1, $index + 1 ];
13620576196ms return $data->[ $index ]; ## RETURN ##
137 }
138 else {
139477740.9ms return (undef, Template::Constants::STATUS_DONE); ## RETURN ##
140 }
141}
142
143
144#------------------------------------------------------------------------
145# get_all()
146#
147# Method which returns all remaining items in the iterator as a Perl list
148# reference. May be called at any time in the life-cycle of the iterator.
149# The get_first() method will be called automatically if necessary, and
150# then subsequent get_next() calls are made, storing each returned
151# result until the list is exhausted.
152#------------------------------------------------------------------------
153
154sub get_all {
155 my $self = shift;
156 my ($max, $index) = @$self{ qw( MAX INDEX ) };
157 my @data;
158
159 # handle cases where get_first() has yet to be called.
160 unless (defined $index) {
161 my ($first, $status) = $self->get_first;
162
163 # refresh $max and $index, after get_first updates MAX and INDEX
164 ($max, $index) = @$self{ qw( MAX INDEX ) };
165
166 # empty lists are handled here.
167 if ($status && $status == Template::Constants::STATUS_DONE) {
168 return (undef, Template::Constants::STATUS_DONE); ## RETURN ##
169 }
170
171 push @data, $first;
172
173 ## if there's nothing left in the iterator, return the single value.
174 unless ($index < $max) {
175 return \@data;
176 }
177 }
178
179 # if there's still some data to go...
180 if ($index < $max) {
181 $index++;
182 push @data, @{ $self->{ _DATASET } } [ $index..$max ];
183
184 # update counters and flags
185 @$self{ qw( INDEX COUNT FIRST LAST ) }
186 = ( $max, $max + 1, 0, 1 );
187
188 return \@data; ## RETURN ##
189 }
190 else {
191 return (undef, Template::Constants::STATUS_DONE); ## RETURN ##
192 }
193}
194
195sub odd {
196 shift->{ COUNT } % 2 ? 1 : 0
197}
198
199sub even {
200 shift->{ COUNT } % 2 ? 0 : 1
201}
202
203sub parity {
204 shift->{ COUNT } % 2 ? ODD : EVEN;
205}
206
207
208#------------------------------------------------------------------------
209# AUTOLOAD
210#
211# Provides access to internal fields (e.g. size, first, last, max, etc)
212#------------------------------------------------------------------------
213
214
# spent 77.2ms (56.4+20.9) within Template::Iterator::AUTOLOAD which was called 5248 times, avg 15µs/call: # 1991 times (15.6ms+10.7ms) by Template::Document::__ANON__[input text:22] at line 11 of /root/tor-browser-build/input text, avg 13µs/call # 1991 times (16.0ms+5.52ms) by Template::Document::__ANON__[input text:43] at line 20 of /root/tor-browser-build/input text, avg 11µs/call # 993 times (15.6ms+2.90ms) by Template::Document::__ANON__[input text:35] at line 16 of /root/tor-browser-build/input text, avg 19µs/call # 273 times (9.12ms+1.76ms) by Template::Document::__ANON__[input text:35] at line 28 of /root/tor-browser-build/input text, avg 40µs/call
sub AUTOLOAD {
21552483.26ms my $self = shift;
21652483.45ms my $item = $AUTOLOAD;
217524859.0ms524820.9ms $item =~ s/.*:://;
# spent 20.9ms making 5248 calls to Template::Iterator::CORE:subst, avg 4µs/call
218524828.7ms return if $item eq 'DESTROY';
219
220 # alias NUMBER to COUNT for backwards compatibility
221 $item = 'COUNT' if $item =~ /NUMBER/i;
222
223 return $self->{ uc $item };
224}
225
226
227#========================================================================
228# ----- PRIVATE DEBUG METHODS -----
229#========================================================================
230
231#------------------------------------------------------------------------
232# _dump()
233#
234# Debug method which returns a string detailing the internal state of
235# the iterator object.
236#------------------------------------------------------------------------
237
238sub _dump {
239 my $self = shift;
240 join('',
241 " Data: ", $self->{ _DATA }, "\n",
242 " Index: ", $self->{ INDEX }, "\n",
243 "Number: ", $self->{ NUMBER }, "\n",
244 " Max: ", $self->{ MAX }, "\n",
245 " Size: ", $self->{ SIZE }, "\n",
246 " First: ", $self->{ FIRST }, "\n",
247 " Last: ", $self->{ LAST }, "\n",
248 "\n"
249 );
250}
251
252
25314µs1;
254
255__END__
 
# spent 6.96ms within Template::Iterator::CORE:sort which was called 1991 times, avg 3µs/call: # 1991 times (6.96ms+0s) by Template::Iterator::new at line 55, avg 3µs/call
sub Template::Iterator::CORE:sort; # opcode
# spent 20.9ms within Template::Iterator::CORE:subst which was called 5248 times, avg 4µs/call: # 5248 times (20.9ms+0s) by Template::Iterator::AUTOLOAD at line 217, avg 4µs/call
sub Template::Iterator::CORE:subst; # opcode
# spent 500ns within Template::Iterator::__ANON__ which was called: # once (500ns+0s) by Template::Iterator::BEGIN@28 at line 28
sub Template::Iterator::__ANON__; # xsub