use warnings ;
use Template::Simple ;
+use Benchmark qw( timethese cmpthese ) ;
use Data::Dumper ;
-my $data = generate_data( 3, 6 ) ;
+my @dims = @ARGV ? (shift, shift) : ( 3, 5 ) ;
+
+my $data = generate_data( @dims ) ;
#print Dumper $data ;
my $tmpl = Template::Simple->new() ;
+my $comp = Template::Simple->new() ;
-$tmpl->add_templates( { bench => <<TMPL } ) ;
+my $template = <<TMPL ;
Header
Val 1: [%val_1%]
-Val 2: [%val_2%]
-Footer
-TMPL
-
-my $x = <<XXX ;
[%START nest%]
Level: [%level%]
[%END nest%]
[%START opt%]
Optional Level: [%level%]
[%END opt%]
-XXX
+Val 2: [%val_2%]
+Footer
+TMPL
+$tmpl->add_templates( { bench => $template } ) ;
+my $rendered = $tmpl->render( 'bench', $data ) ;
+$comp->add_templates( { bench => $template } ) ;
+$comp->compile( 'bench' ) ;
+my $comp_rendered = $comp->render( 'bench', $data ) ;
+#print $comp->get_source( 'bench' ) ;
-my $rendered = $tmpl->render( 'bench', $data ) ;
+my $ok = $$rendered eq $$comp_rendered ;
+print "OK comp [$ok]\n" ;
+
+my $appended = append( $data ) ;
+$ok = $$rendered eq $$appended ;
+print "OK append [$ok]\n" ;
+
+#print $$rendered ;
+#my $joined = joined( $data ) ;
+# print $$rendered ;
+# print "----\n" ;
+# print $$joined ;
+# print $$comp_rendered ;
+
+cmpthese( shift || -2,
+ {
+ render => sub { my $x = $tmpl->render( 'bench', $data ) },
+# joined => sub { my $x = joined( $data ) },
+# concat => sub { my $x = concat( $data ) },
+ append => sub { my $x = append( $data ) },
+# compiler => sub { my $x = $comp->compile( 'bench' ) },
+ compiled => sub { my $x = $comp->render( 'bench', $data ) },
+ }
+) ;
-$tmpl->compile( 'bench', $data ) ;
-print $tmpl->get_source( 'bench' ) ;
+exit ;
-my $comp_rendered = $tmpl->render( 'bench', $data ) ;
+no warnings ;
-my $ok = $$rendered eq $$comp_rendered ;
+sub joined {
-print "OK [$ok]\n" ;
+no warnings ;
-print $$rendered ;
-print $$comp_rendered ;
+ my( $data ) = @_ ;
-exit ;
+ my $out = do {
+ my $out ;
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
+ $out .= ref $data ne 'HASH' ? $data :
-no warnings ;
+ join( '',
+ "Header\nVal 1: "
+ ,
+ $data->{val_1}
+ ,
+ "\n"
+ ,
+ do {
+ my $data = $data->{nest} ;
+ my $out ;
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
-sub rendered {
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
-}
+ $out .= ref $data ne 'HASH' ? $data :
+ join( '',
+ "\n\tLevel: "
+ ,
+ $data->{level}
+ ,
+ "\n" ) ;
+ }
+ $out ;
+ }
+ ,
+ "\n"
+ ,
+ do {
+ my $data = $data->{opt} ;
+ my $out ;
-sub map_join {
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
-}
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
-sub append {
+ $out .= ref $data ne 'HASH' ? $data :
+ join( '',
+ "\n\tOptional Level: "
+ ,
+ $data->{level}
+ ,
+ "\n" ) ;
+ }
+ $out ;
+ }
+ ,
+ "\nVal 2: "
+ ,
+ $data->{val_2}
+ ,
+ "\nFooter\n" ) ;
+ }
+ $out ;
+ } ;
+ return \$out ;
}
sub concat {
+no warnings ;
+
my( $data ) = @_ ;
my $out = do {
my $out ;
- foreach my $data ( ref $data eq 'ARRAY' ? @{$data} : $data ) {
+
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
+
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
$out .= ref $data ne 'HASH' ? $data :
- "text1\n"
+ "Header\nVal 1: "
+ .
+ $data->{val_1}
+ .
+ "\n"
.
do {
my $data = $data->{nest} ;
-
my $out ;
- foreach my $data ( ref $data eq 'ARRAY' ? @{$data} : $data ) {
+
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
+
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
$out .= ref $data ne 'HASH' ? $data :
- "\n\tBAR is "
+ "\n\tLevel: "
.
- $data->{bar}
+ $data->{level}
.
"\n" ;
}
+ $out ;
+ }
+ .
+ "\n"
+ .
+ do {
+ my $data = $data->{opt} ;
+ my $out ;
+
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
+ $out .= ref $data ne 'HASH' ? $data :
+ "\n\tOptional Level: "
+ .
+ $data->{level}
+ .
+ "\n" ;
+ }
$out ;
}
.
- "\n" ;
+ "\nVal 2: "
+ .
+ $data->{val_2}
+ .
+ "\nFooter\n" ;
}
+
$out ;
} ;
return \$out ;
}
+sub append {
+ my( $data ) = @_ ;
+
+ my $out ;
+
+ my @data = $data ;
+ while( defined( my $data = shift @data ) ) {
+
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
+
+
+ $out .= ref $data ne 'HASH' ? $data :
+ "Header\nVal 1: "
+ .
+ $data->{val_1}
+ .
+ "\n" ;
+
+ my @data = $data->{nest} ;
+ while( defined( my $data = shift @data ) ) {
+
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
+
+
+ $out .= ref $data ne 'HASH' ? $data :
+ "\n\tLevel: "
+ .
+ $data->{level}
+ .
+ "\n" ;
+
+ }
+
+ $out .= ref $data ne 'HASH' ? $data :
+ "\n" ;
+
+ my @data = $data->{opt} ;
+ while( defined( my $data = shift @data ) ) {
+
+ if ( ref $data eq 'ARRAY' ) {
+ push @data, @{$data} ;
+ next ;
+ }
+
+
+ $out .= ref $data ne 'HASH' ? $data :
+ "\n\tOptional Level: "
+ .
+ $data->{level}
+ .
+ "\n" ;
+
+ }
+
+ $out .= ref $data ne 'HASH' ? $data :
+ "\nVal 2: "
+ .
+ $data->{val_2}
+ .
+ "\nFooter\n" ;
+
+ }
+
+ return \$out ;
+}
sub generate_data {