changed version number
[urisagit/Template-Simple.git] / bench.pl
CommitLineData
540289da 1#!/usr/local/bin/perl
2
3use strict ;
4use warnings ;
5
6use Template::Simple ;
4ba84a4f 7use Benchmark qw( timethese cmpthese ) ;
540289da 8use Data::Dumper ;
9
107d4494 10my @dims = @ARGV ? (shift, shift) : ( 3, 5 ) ;
50126214 11
12my $data = generate_data( @dims ) ;
540289da 13#print Dumper $data ;
14
15my $tmpl = Template::Simple->new() ;
107d4494 16my $comp = Template::Simple->new() ;
540289da 17
50126214 18my $template = <<TMPL ;
540289da 19Header
20Val 1: [%val_1%]
540289da 21[%START nest%]
22 Level: [%level%]
23[%END nest%]
24[%START opt%]
25 Optional Level: [%level%]
26[%END opt%]
50126214 27Val 2: [%val_2%]
28Footer
29TMPL
540289da 30
50126214 31$tmpl->add_templates( { bench => $template } ) ;
540289da 32my $rendered = $tmpl->render( 'bench', $data ) ;
33
107d4494 34$comp->add_templates( { bench => $template } ) ;
35$comp->compile( 'bench' ) ;
36my $comp_rendered = $comp->render( 'bench', $data ) ;
37#print $comp->get_source( 'bench' ) ;
540289da 38
107d4494 39my $ok = $$rendered eq $$comp_rendered ;
40print "OK comp [$ok]\n" ;
540289da 41
107d4494 42my $appended = append( $data ) ;
43$ok = $$rendered eq $$appended ;
44print "OK append [$ok]\n" ;
540289da 45
107d4494 46#print $$rendered ;
47#my $joined = joined( $data ) ;
50126214 48# print $$rendered ;
49# print "----\n" ;
50# print $$joined ;
107d4494 51# print $$comp_rendered ;
50126214 52
4ba84a4f 53cmpthese( shift || -2,
50126214 54 {
55 render => sub { my $x = $tmpl->render( 'bench', $data ) },
107d4494 56# joined => sub { my $x = joined( $data ) },
57# concat => sub { my $x = concat( $data ) },
50126214 58 append => sub { my $x = append( $data ) },
107d4494 59# compiler => sub { my $x = $comp->compile( 'bench' ) },
60 compiled => sub { my $x = $comp->render( 'bench', $data ) },
50126214 61 }
62) ;
540289da 63
64exit ;
65
50126214 66no warnings ;
67
50126214 68sub joined {
540289da 69
70no warnings ;
71
50126214 72 my( $data ) = @_ ;
540289da 73
50126214 74 my $out = do {
75 my $out ;
540289da 76
50126214 77 my @data = $data ;
78 while( defined( my $data = shift @data ) ) {
79
80 if ( ref $data eq 'ARRAY' ) {
81 push @data, @{$data} ;
82 next ;
83 }
84
85 $out .= ref $data ne 'HASH' ? $data :
86
87 join( '',
88 "Header\nVal 1: "
89 ,
90 $data->{val_1}
91 ,
92 "\n"
93 ,
94 do {
95 my $data = $data->{nest} ;
96 my $out ;
97
98 my @data = $data ;
99 while( defined( my $data = shift @data ) ) {
100
101 if ( ref $data eq 'ARRAY' ) {
102 push @data, @{$data} ;
103 next ;
104 }
105
106 $out .= ref $data ne 'HASH' ? $data :
107 join( '',
108 "\n\tLevel: "
109 ,
110 $data->{level}
111 ,
112 "\n" ) ;
113 }
114 $out ;
115 }
116 ,
117 "\n"
118 ,
119 do {
120 my $data = $data->{opt} ;
121 my $out ;
122
123 my @data = $data ;
124 while( defined( my $data = shift @data ) ) {
125
126 if ( ref $data eq 'ARRAY' ) {
127 push @data, @{$data} ;
128 next ;
129 }
540289da 130
50126214 131 $out .= ref $data ne 'HASH' ? $data :
132 join( '',
133 "\n\tOptional Level: "
134 ,
135 $data->{level}
136 ,
137 "\n" ) ;
138 }
139 $out ;
140 }
141 ,
142 "\nVal 2: "
143 ,
144 $data->{val_2}
145 ,
146 "\nFooter\n" ) ;
147 }
148 $out ;
149 } ;
540289da 150
50126214 151 return \$out ;
540289da 152}
153
50126214 154
540289da 155sub concat {
156
50126214 157no warnings ;
158
540289da 159 my( $data ) = @_ ;
160
161 my $out = do {
162 my $out ;
50126214 163
164 my @data = $data ;
165 while( defined( my $data = shift @data ) ) {
166
167 if ( ref $data eq 'ARRAY' ) {
168 push @data, @{$data} ;
169 next ;
170 }
540289da 171
172 $out .= ref $data ne 'HASH' ? $data :
50126214 173 "Header\nVal 1: "
174 .
175 $data->{val_1}
176 .
177 "\n"
540289da 178 .
179 do {
180 my $data = $data->{nest} ;
540289da 181 my $out ;
50126214 182
183 my @data = $data ;
184 while( defined( my $data = shift @data ) ) {
185
186 if ( ref $data eq 'ARRAY' ) {
187 push @data, @{$data} ;
188 next ;
189 }
540289da 190
191 $out .= ref $data ne 'HASH' ? $data :
50126214 192 "\n\tLevel: "
540289da 193 .
50126214 194 $data->{level}
540289da 195 .
196 "\n" ;
197 }
50126214 198 $out ;
199 }
200 .
201 "\n"
202 .
203 do {
204 my $data = $data->{opt} ;
205 my $out ;
540289da 206
50126214 207 my @data = $data ;
208 while( defined( my $data = shift @data ) ) {
540289da 209
50126214 210 if ( ref $data eq 'ARRAY' ) {
211 push @data, @{$data} ;
212 next ;
213 }
214
215 $out .= ref $data ne 'HASH' ? $data :
216 "\n\tOptional Level: "
217 .
218 $data->{level}
219 .
220 "\n" ;
221 }
540289da 222 $out ;
223 }
224 .
50126214 225 "\nVal 2: "
226 .
227 $data->{val_2}
228 .
229 "\nFooter\n" ;
540289da 230 }
107d4494 231
540289da 232 $out ;
233 } ;
234
235 return \$out ;
236}
237
50126214 238sub append {
50126214 239 my( $data ) = @_ ;
240
241 my $out ;
242
243 my @data = $data ;
244 while( defined( my $data = shift @data ) ) {
245
246 if ( ref $data eq 'ARRAY' ) {
247 push @data, @{$data} ;
248 next ;
249 }
250
107d4494 251
50126214 252 $out .= ref $data ne 'HASH' ? $data :
253 "Header\nVal 1: "
254 .
255 $data->{val_1}
256 .
257 "\n" ;
258
259 my @data = $data->{nest} ;
260 while( defined( my $data = shift @data ) ) {
261
262 if ( ref $data eq 'ARRAY' ) {
263 push @data, @{$data} ;
264 next ;
265 }
266
107d4494 267
50126214 268 $out .= ref $data ne 'HASH' ? $data :
269 "\n\tLevel: "
270 .
271 $data->{level}
272 .
273 "\n" ;
107d4494 274
50126214 275 }
276
107d4494 277 $out .= ref $data ne 'HASH' ? $data :
50126214 278 "\n" ;
279
280 my @data = $data->{opt} ;
281 while( defined( my $data = shift @data ) ) {
282
283 if ( ref $data eq 'ARRAY' ) {
284 push @data, @{$data} ;
285 next ;
286 }
287
107d4494 288
50126214 289 $out .= ref $data ne 'HASH' ? $data :
290 "\n\tOptional Level: "
291 .
292 $data->{level}
293 .
294 "\n" ;
107d4494 295
50126214 296 }
297
107d4494 298 $out .= ref $data ne 'HASH' ? $data :
50126214 299 "\nVal 2: "
300 .
301 $data->{val_2}
302 .
303 "\nFooter\n" ;
107d4494 304
50126214 305 }
306
307 return \$out ;
308}
309
540289da 310sub generate_data {
311
312 my( $outer_size, $inner_size ) = @_ ;
313
314 my @outer_data ;
315
316 for my $outer ( 1 .. $outer_size ) {
317
318 my @inner_data ;
319
320 for my $inner ( 1 .. $inner_size ) {
321
322 push @inner_data, {
323
324 val_1 => ($outer x 2),
325 val_2 => ($inner x 3),
326 nest => {
327 level => "$outer-$inner",
328 },
329 $inner % 2 ? () : (
330
331 opt => {
332 level => "$outer-$inner",
333 },
334 ),
335 } ;
336 }
337
338 push @outer_data, [@inner_data] ;
339 }
340
341 return \@outer_data ;
342}