1
Perl / как оптимизировать
« : 06 Марта 2006, 18:49:57 »
Код теста, Benchmark.pm я не очень доверяю, из-за точности вычеслений.
#!/usr/bin/perl -w
#!/usr/bin/perl -w
use Time::HiRes qw(gettimeofday tv_interval);
use strict;
my @a = (1 ... 10000);
my $count = 1000;
my @c = (1 ... $count);
open (NULL, \'>nul\'); # nul для венды, или /dev/null для никсов
my $foreach = sub
{
foreach (@a)
{
print NULL $_;
};
};
my $for = sub
{
for (@a)
{
print NULL $_;
};
};
my $map = sub
{
my $cnt = @a;
while ($cnt)
{
print NULL $a[$_];
$cnt--;
}
};
my @foreach;
my @while;
my @map;
print "Элементов в массиве: ", scalar @a ,"\\n";
print "Выполняем $count прогонов for ...";
for (@c)
{
my $t0 = [gettimeofday];
&$for;
push (@while, tv_interval($t0));
}
print "OK!\\n";
my $ttl = 0;
map { $ttl += $_ } @while;
my $avrg = $ttl / scalar(@while);
printf("Потраченно: %.5f (%f, %s)\\n", $avrg, $ttl, scalar(@while));
print "Выполняем $count прогонов foreach ...";
for (@c)
{
my $t0 = [gettimeofday];
&$foreach;
push (@foreach, tv_interval($t0));
}
print "OK!\\n";
$ttl = 0;
map { $ttl += $_ } @foreach;
$avrg = $ttl / scalar(@foreach);
printf("Потраченно: %.5f (%f, %s)\\n", $avrg, $ttl, scalar(@foreach));
print "Выполняем $count прогонов while ...";
for (@c)
{
my $t0 = [gettimeofday];
&$map;
push (@map, tv_interval($t0));
}
print "OK!\\n";
$ttl = 0;
map { $ttl += $_ } @foreach;
$avrg = $ttl / scalar(@map);
printf("Потраченно: %.5f (%f, %s)\\n", $avrg, $ttl, scalar(@map));