13 use Benchmark qw(:hireswallclock cmpthese);
15 my $opts = parse_options() ;
23 expected => 'hehe bob',
24 simple => 'hehe [% name %]',
25 toolkit => 'hehe [% name %]',
26 teeny => 'hehe [% name %]',
27 tiny => 'hehe [% name %]',
39 title => 'Something new',
44 expected => <<EXPECTED,
46 <head><title>Bobs Blog</title></head>
54 <h3>Something new</h3>
55 <span>3 Days ago</span>
64 <head><title>[% title %]</title></head>
69 <span>[% date %]</span>
78 <head><title>[% title %]</title></head>
80 <ul>[% FOREACH post = posts %]
82 <h3>[% post.title %]</h3>
83 <span>[% post.date %]</span>
92 <head><title>[% title %]</title></head>
94 <ul>[% FOREACH post IN posts %]
96 <h3>[% post.title %]</h3>
97 <span>[% post.date %]</span>
106 <head><title>[% title %]</title></head>
108 <ul>[% SECTION post %]
111 <span>[% date %]</span>
124 template_key => 'simple',
126 return eval { require Template::Simple } ;
129 my( $bench, $info ) = @_ ;
131 my $template = $info->{$bench->{template_key}} ;
132 my $data = $info->{data} ;
133 my $name = $info->{name} ;
135 my $obj = Template::Simple->new(
136 templates => { $name => $template }
140 sub { $obj->render( $name, $data ) } ;
143 my( $bench, $info ) = @_ ;
144 my $result = $bench->{render}->() ;
145 $bench->{result} = ${$result} ;
149 name => 'T::S compiled',
150 template_key => 'simple',
152 return eval { require Template::Simple } ;
155 my( $bench, $info ) = @_ ;
157 my $template = $info->{$bench->{template_key}} ;
158 my $data = $info->{data} ;
159 my $name = $info->{name} ;
161 my $obj = Template::Simple->new(
162 templates => { $name => $template }
164 $obj->compile( $name ) ;
167 sub { $obj->render( $name, $data ) } ;
170 my( $bench, $info ) = @_ ;
171 my $result = $bench->{render}->() ;
172 $bench->{result} = ${$result} ;
177 template_key => 'teeny',
180 require Template::Teeny ;
181 require Template::Teeny::Stash ;
185 my( $bench, $info ) = @_ ;
187 my $template = $info->{$bench->{template_key}} ;
188 my $data = $info->{data} ;
189 my $name = $info->{name} ;
192 # open my $fh, '>', \$results or
193 # open my $fh, '>', '/dev/null' or
194 # die "can't open string for output" ;
197 write_file( "tpl/$name.tpl", $template ) ;
198 my $obj = Template::Teeny->new(
199 { include_path => ['tpl'] }
203 if ( my $posts = $data->{posts} ) {
205 $stash = Template::Teeny::Stash->new(
206 { title => $data->{title} }
209 foreach my $post ( @{$posts} ) {
212 Template::Teeny::Stash->new(
215 $stash->add_section('post', $substash );
219 $stash = Template::Teeny::Stash->new(
225 #print Dumper $stash ;
227 sub { $obj->process("$name.tpl", $stash ); }
231 my( $bench, $info ) = @_ ;
232 $bench->{result} = $bench->{render}->() ;
237 template_key => 'toolkit',
238 load => sub { return eval { require Template } ; },
240 my( $bench, $info ) = @_ ;
242 my $template = $info->{$bench->{template_key}} ;
243 my $data = $info->{data} ;
245 my $obj = Template->new() ;
247 $bench->{render} = sub {
249 $obj->process(\$template, $data, \$output );
255 my( $bench, $info ) = @_ ;
256 $bench->{result} = $bench->{render}->() ;
261 template_key => 'tiny',
262 load => sub { return eval { require Template::Tiny } ; },
264 my( $bench, $info ) = @_ ;
266 my $template = $info->{$bench->{template_key}} ;
267 my $data = $info->{data} ;
269 my $obj = Template::Tiny->new() ;
271 $bench->{render} = sub {
273 $obj->process( \$template, $data, \$output );
278 my( $bench, $info ) = @_ ;
279 $bench->{result} = $bench->{render}->() ;
288 foreach my $info ( @{$template_info} ) {
292 foreach my $bench ( @{$benches} ) {
294 my $loaded = $bench->{load}->() ;
297 Skipping $bench->{name} as it didn't load
302 $bench->{setup}->( $bench, $info ) ;
304 if ( $opts->{verify} ) {
305 $bench->{verify}->( $bench, $info ) ;
307 if ( $bench->{result} ne $info->{expected} ) {
310 Skipping $bench->{name} as it doesn't have verified results.
311 RESULT [$bench->{result}]\nEXPECTED [$info->{expected}]
317 '$bench->{name}' rendering of '$info->{name}' is verified
322 $compares{ $bench->{name} } = $bench->{render} ;
325 print "\nBenchmark of '$info->{name}' template\n" ;
326 cmpthese( $opts->{iterations}, \%compares ) ;
333 GetOptions( \my %opts,
340 usage( '' ) if $opts{ 'help' } ;
342 $opts{iterations} ||= -2 ;
344 $opts{templaters} = [split /,/, $opts{templaters}]
345 if $opts{templaters} ;
352 my $err_msg = shift || '' ;
354 my $usage = <<'=cut' ;
356 bench_templates.pl - Benchmark Multiple Templaters
360 load_menus.pl [--verify | -v] [--iterations | -i <iter>]
361 [--templaters| -t <templaters>] [--help]
365 --verify | -v Verify rendered output is correct
366 --iterations | -i <iter> Iteration count passed to cmpthese
367 Default is -2 (seconds of cpu time)
368 --templaters | -t <templaters> Comma separated list of templaters
369 to run in this benchmark
371 [--help | ?] Print this help text
375 $usage =~ s/^=\w+.*$//mg ;
377 $usage =~ s/\n{2,}/\n\n/g ;
378 $usage =~ s/\A\n+// ;
380 die "$err_msg\n$usage" ;