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