← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/share/koha/opac/cgi-bin/opac/opac-search.pl
  Run on Tue Oct 15 17:10:45 2013
Reported on Tue Oct 15 17:12:57 2013

Filename/usr/lib/perl5/Template/Iterator.pm
StatementsExecuted 1094 statements in 4.30ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
79541.25ms1.25msTemplate::Iterator::::get_nextTemplate::Iterator::get_next
1211442µs482µsTemplate::Iterator::::newTemplate::Iterator::new
3784433µs607µsTemplate::Iterator::::AUTOLOADTemplate::Iterator::AUTOLOAD
1274276µs276µsTemplate::Iterator::::get_firstTemplate::Iterator::get_first
3711161µs161µsTemplate::Iterator::::CORE:substTemplate::Iterator::CORE:subst (opcode)
251168µs68µsTemplate::Iterator::::oddTemplate::Iterator::odd
11125µs31µsTemplate::Iterator::::BEGIN@24Template::Iterator::BEGIN@24
11120µs104µsTemplate::Iterator::::BEGIN@26Template::Iterator::BEGIN@26
11116µs77µsTemplate::Iterator::::BEGIN@25Template::Iterator::BEGIN@25
11116µs21µsTemplate::Iterator::::BEGIN@28Template::Iterator::BEGIN@28
11116µs51µsTemplate::Iterator::::BEGIN@27Template::Iterator::BEGIN@27
11115µs60µsTemplate::Iterator::::BEGIN@29Template::Iterator::BEGIN@29
11113µs72µsTemplate::Iterator::::BEGIN@31Template::Iterator::BEGIN@31
251112µs12µsTemplate::Iterator::::CORE:matchTemplate::Iterator::CORE:match (opcode)
11110µs43µsTemplate::Iterator::::BEGIN@32Template::Iterator::BEGIN@32
0000s0sTemplate::Iterator::::_dumpTemplate::Iterator::_dump
0000s0sTemplate::Iterator::::evenTemplate::Iterator::even
0000s0sTemplate::Iterator::::get_allTemplate::Iterator::get_all
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
24334µs238µs
# spent 31µs (25+6) within Template::Iterator::BEGIN@24 which was called: # once (25µs+6µs) by Template::Config::load at line 24
use strict;
# spent 31µs making 1 call to Template::Iterator::BEGIN@24 # spent 6µs making 1 call to strict::import
25338µs2137µs
# spent 77µs (16+60) within Template::Iterator::BEGIN@25 which was called: # once (16µs+60µs) by Template::Config::load at line 25
use warnings;
# spent 77µs making 1 call to Template::Iterator::BEGIN@25 # spent 60µs making 1 call to warnings::import
26343µs2188µs
# spent 104µs (20+84) within Template::Iterator::BEGIN@26 which was called: # once (20µs+84µs) by Template::Config::load at line 26
use base 'Template::Base';
# spent 104µs making 1 call to Template::Iterator::BEGIN@26 # spent 84µs making 1 call to base::import
27333µs286µs
# spent 51µs (16+35) within Template::Iterator::BEGIN@27 which was called: # once (16µs+35µs) by Template::Config::load at line 27
use Template::Constants;
# spent 51µs making 1 call to Template::Iterator::BEGIN@27 # spent 35µs making 1 call to Exporter::import
283114µs226µs
# spent 21µs (16+5) within Template::Iterator::BEGIN@28 which was called: # once (16µs+5µs) by Template::Config::load at line 28
use Template::Exception;
# spent 21µs making 1 call to Template::Iterator::BEGIN@28 # spent 5µs making 1 call to UNIVERSAL::import
29337µs2104µs
# spent 60µs (15+44) within Template::Iterator::BEGIN@29 which was called: # once (15µs+44µs) by Template::Config::load at line 29
use Scalar::Util qw(blessed);
# spent 60µs making 1 call to Template::Iterator::BEGIN@29 # spent 44µs making 1 call to Exporter::import
30
31338µs2131µs
# spent 72µs (13+59) within Template::Iterator::BEGIN@31 which was called: # once (13µs+59µs) by Template::Config::load at line 31
use constant ODD => 'odd';
# spent 72µs making 1 call to Template::Iterator::BEGIN@31 # spent 59µs making 1 call to constant::import
323915µs275µs
# spent 43µs (10+32) within Template::Iterator::BEGIN@32 which was called: # once (10µs+32µs) by Template::Config::load at line 32
use constant EVEN => 'even';
# spent 43µs making 1 call to Template::Iterator::BEGIN@32 # spent 33µs making 1 call to constant::import
33
341500nsour $VERSION = 2.68;
351600nsour $DEBUG = 0 unless defined $DEBUG;
361200nsour $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 482µs (442+40) within Template::Iterator::new which was called 12 times, avg 40µs/call: # 12 times (442µs+40µs) by Template::Config::iterator at line 177 of Template/Config.pm, avg 40µs/call
sub new {
511215µs my $class = shift;
521212µs my $data = shift || [ ];
531217µs my $params = shift || { };
54
5512127µs1240µs if (ref $data eq 'HASH') {
# spent 40µs making 12 calls to Scalar::Util::blessed, avg 3µs/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 {
7012326µs _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 276µs within Template::Iterator::get_first which was called 12 times, avg 23µs/call: # 5 times (109µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc:32] at line 20 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc, avg 22µs/call # 2 times (41µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/page-numbers.inc:31] at line 14 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/page-numbers.inc, avg 21µs/call # once (69µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc:32] at line 22 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc # once (22µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 522 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt # once (18µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/masthead.inc:111] at line 80 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/masthead.inc # once (13µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 393 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt # once (4µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 394 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt
sub get_first {
901210µs my $self = shift;
911249µs my $data = $self->{ _DATA };
92
931219µs $self->{ _DATASET } = $self->{ _DATA };
941211µs my $size = scalar @$data;
95125µs my $index = 0;
96
97128µs return (undef, Template::Constants::STATUS_DONE) unless $size;
98
99 # initialise various counters, flags, etc.
1001189µs @$self{ qw( SIZE MAX INDEX COUNT FIRST LAST ) }
101 = ( $size, $size - 1, $index, 1, 1, $size > 1 ? 0 : 1, undef );
1021145µs @$self{ qw( PREV NEXT ) } = ( undef, $self->{ _DATASET }->[ $index + 1 ]);
103
1041173µs 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 1.25ms within Template::Iterator::get_next which was called 79 times, avg 16µs/call: # 28 times (533µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc:32] at line 14 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc, avg 19µs/call # 25 times (350µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 515 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt, avg 14µs/call # 20 times (177µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/page-numbers.inc:31] at line 8 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/page-numbers.inc, avg 9µs/call # 4 times (169µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/masthead.inc:111] at line 81 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/masthead.inc, avg 42µs/call # 2 times (16µs+0s) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 394 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt, avg 8µs/call
sub get_next {
11879107µs my $self = shift;
11979148µs my ($max, $index) = @$self{ qw( MAX INDEX ) };
1207968µs my $data = $self->{ _DATASET };
121
122 # warn about incorrect usage
1237961µs 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...
1307951µs if ($index < $max) {
131 # update counters and flags
1326821µs $index++;
13368318µs @$self{ qw( INDEX COUNT FIRST LAST ) }
134 = ( $index, $index + 1, 0, $index == $max ? 1 : 0 );
13568184µs @$self{ qw( PREV NEXT ) } = @$data[ $index - 1, $index + 1 ];
13668439µs return $data->[ $index ]; ## RETURN ##
137 }
138 else {
1391154µs 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
195
# spent 68µs within Template::Iterator::odd which was called 25 times, avg 3µs/call: # 25 times (68µs+0s) by Template::Stash::XS::get at line 419 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt, avg 3µs/call
sub odd {
19625107µs 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 607µs (433+173) within Template::Iterator::AUTOLOAD which was called 37 times, avg 16µs/call: # 25 times (321µs+111µs) by Template::Stash::XS::get at line 501 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt, avg 17µs/call # 5 times (60µs+33µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc:32] at line 11 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc, avg 19µs/call # 2 times (12µs+8µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/page-numbers.inc:31] at line 5 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/page-numbers.inc, avg 10µs/call # once (14µs+5µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/masthead.inc:111] at line 71 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/masthead.inc # once (9µs+5µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc:32] at line 13 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/includes/opac-facets.inc # once (8µs+4µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 385 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt # once (5µs+4µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 384 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt # once (5µs+3µs) by Template::Document::__ANON__[/usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt:541] at line 513 of /usr/share/koha/opac/htdocs/opac-tmpl/prog/en-NZ/modules/opac-results.tt
sub AUTOLOAD {
2153729µs my $self = shift;
2163722µs my $item = $AUTOLOAD;
21737287µs37161µs $item =~ s/.*:://;
# spent 161µs making 37 calls to Template::Iterator::CORE:subst, avg 4µs/call
21837101µs return if $item eq 'DESTROY';
219
220 # alias NUMBER to COUNT for backwards compatability
2212572µs2512µs $item = 'COUNT' if $item =~ /NUMBER/i;
# spent 12µs making 25 calls to Template::Iterator::CORE:match, avg 500ns/call
222
22325168µs 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 12µs within Template::Iterator::CORE:match which was called 25 times, avg 500ns/call: # 25 times (12µs+0s) by Template::Iterator::AUTOLOAD at line 221, avg 500ns/call
sub Template::Iterator::CORE:match; # opcode
# spent 161µs within Template::Iterator::CORE:subst which was called 37 times, avg 4µs/call: # 37 times (161µs+0s) by Template::Iterator::AUTOLOAD at line 217, avg 4µs/call
sub Template::Iterator::CORE:subst; # opcode