File time-array-init.pl tests how long each method of initializing and filling an array takes:
use Time::HiRes qw(gettimeofday);
use strict; use warnings;
sub timeSub {
my ($sub, @parms) = @_;
my ($sec0, $micro0)=gettimeofday;
my $name = $sub->(1000000, @parms);
my ($sec1, $micro1)=gettimeofday;
my $diff = 1000000*($sec1-$sec0) + $micro1-$micro0;
print "$name:\t$diff microseconds\n";
}
sub pushInit {
my $loops = shift;
my @x; for (my $i=0; $i<$loops; $i++) { push(@x, 1) }
return "push";
}
sub elInit {
my $loops = shift;
my @x; for (my $i=0; $i<$loops; $i++) { $x[$i] = 1 }
return "\$a[\$i]";
}
sub xInit {
my $loops = shift;
my @x = (1) x $loops;
return "(1) x";
}
# This method builds the array (1, 2, 3, ...), not (1, 1, 1, ...)
sub dotInit {
my $loops = shift;
my @x = 1..$loops;
return "..";
}
foreach my $subR (\&pushInit, \&elInit, \&xInit, \&dotInit) {
&timeSub($subR);
}
Running it:
$ perl time-array-init.pl
push: 171028 microseconds
$a[$i]: 163881 microseconds
(1) x: 51077 microseconds
..: 70115 microseconds
I would guess that the first 2 methods also consume a lot more memory, as Perl 5 isn't good at reclaiming memory from deleted objects.