Commit | Line | Data |
540289da |
1 | #!/usr/local/bin/perl |
2 | |
3 | use strict ; |
4 | use warnings ; |
5 | |
6 | use Template::Simple ; |
4ba84a4f |
7 | use Benchmark qw( timethese cmpthese ) ; |
540289da |
8 | use Data::Dumper ; |
9 | |
107d4494 |
10 | my @dims = @ARGV ? (shift, shift) : ( 3, 5 ) ; |
50126214 |
11 | |
12 | my $data = generate_data( @dims ) ; |
540289da |
13 | #print Dumper $data ; |
14 | |
15 | my $tmpl = Template::Simple->new() ; |
107d4494 |
16 | my $comp = Template::Simple->new() ; |
540289da |
17 | |
50126214 |
18 | my $template = <<TMPL ; |
540289da |
19 | Header |
20 | Val 1: [%val_1%] |
540289da |
21 | [%START nest%] |
22 | Level: [%level%] |
23 | [%END nest%] |
24 | [%START opt%] |
25 | Optional Level: [%level%] |
26 | [%END opt%] |
50126214 |
27 | Val 2: [%val_2%] |
28 | Footer |
29 | TMPL |
540289da |
30 | |
50126214 |
31 | $tmpl->add_templates( { bench => $template } ) ; |
540289da |
32 | my $rendered = $tmpl->render( 'bench', $data ) ; |
33 | |
107d4494 |
34 | $comp->add_templates( { bench => $template } ) ; |
35 | $comp->compile( 'bench' ) ; |
36 | my $comp_rendered = $comp->render( 'bench', $data ) ; |
37 | #print $comp->get_source( 'bench' ) ; |
540289da |
38 | |
107d4494 |
39 | my $ok = $$rendered eq $$comp_rendered ; |
40 | print "OK comp [$ok]\n" ; |
540289da |
41 | |
107d4494 |
42 | my $appended = append( $data ) ; |
43 | $ok = $$rendered eq $$appended ; |
44 | print "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 |
53 | cmpthese( 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 | |
64 | exit ; |
65 | |
50126214 |
66 | no warnings ; |
67 | |
50126214 |
68 | sub joined { |
540289da |
69 | |
70 | no 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 |
155 | sub concat { |
156 | |
50126214 |
157 | no 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 |
238 | sub 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 |
310 | sub 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 | } |