#! /usr/bin/perl -wT
use strict;
use Benchmark;
use Template;
# Generate some 'data'
my @data;
for (my $i = 0 ; $i < 10 ; $i++ ) {
my %hash;
$hash{ 'id' } = $i;
my @values;
my $num = 5 + rand 20;
for (my $j = 0 ; $j < $num; $j++ ) {
push @values, rand 10000;
}
$hash{ 'datum' } = \@values;
push @data, \%hash;
}
my $string;
# Method 1: Regenerate the template every time (duh, should be slow...)
timethis( 1, sub
{
foreach my $datum ( @data ) {
my $tt1 = Template->new;
# get the average...
my $average = 0;
foreach my $j ( @{ $datum->{ 'datum' } } ) {
$average += $j;
}
$average = $average / @{ $datum->{ 'datum' }};
$tt1->process( 'method_1', {
id => $datum->{ 'id' },
values => join(',', @{$datum->{ 'datum' }} ),
average => $average
}, \$string );
}
});
# Method 2: No template regeneration...
timethis( 1, sub
{
my $tt2 = Template->new;
foreach my $datum ( @data ) {
# get the average...
my $average = 0;
foreach my $j ( @{ $datum->{ 'datum' } } ) {
$average += $j;
}
$average = $average / @{ $datum->{ 'datum' }};
$tt2->process( 'method_1', {
id => $datum->{ 'id' },
values => join(',', @{$datum->{ 'datum' }} ),
average => $average
}, \$string );
}
});
# Method 3: Let Template Toolkit handle some functions
timethis( 1, sub
{
my $tt3 = Template->new;
$tt3->process( 'method_3', {
data => \@data
}, \$string );
});
# Method 4: Doing some processing in perl before sending to Template
timethis( 1, sub
{
my $tt4 = Template->new;
foreach my $datum ( @data ) {
# get the average...
my $average = 0;
foreach my $j ( @{ $datum->{ 'datum' } } ) {
$average += $j;
}
$datum->{ 'average' } = $average / @{ $datum->{ 'datum' }};
}
$tt4->process( 'method_4', {
data => \@data
}, \$string );
});
# Method 5: Doing all processing in perl before sending to Template
timethis( 1, sub
{
my $tt5 = Template->new;
foreach my $datum ( @data ) {
# get the average...
my $average = 0;
foreach my $j ( @{ $datum->{ 'datum' } } ) {
$average += $j;
}
$datum->{ 'average' } = $average / @{ $datum->{ 'datum' }};
$datum->{ 'values' } = join( ',', @{ $datum->{ 'datum' }} );
}
$tt5->process( 'method_5', {
data => \@data
}, \$string );
});
####
[% id %] - [% values %] ==> [% average %]
##
##
[% FOREACH n = data %]
[% average = 0 %]
[% FOREACH j = n.datum %]
[% average = average + j %]
[% END %]
[% average = average / n.datum.size %]
[% n.id %] - [% n.datum.join(',') %] ==> [% average %]
[% END %]
##
##
[% FOREACH n = data %]
[% n.id %] - [% n.datum.join(',') %] ==> [% n.average %]
[% END %]
##
##
[% FOREACH n = data %]
[% n.id %] - [% n.values %] ==> [% n.average %]
[% END %]