From what I see of the code, in one you are moving a string
in and splitting and returning a list; and in the other you are dereferencing an
array ref and making a new list from that array's elements.
Breaking it down further, I'd say what you are really
benchmarking is the speed difference between creating a
new set of scalars and upping the refcount on an existing
set of scalars.
Both move a single scalar, both create and return a list,
but one creates new scalars and another must run an array
down and return all it's guts after changing each one. Running
the benchmark below, I get split losing just barely on
linux but the difference varied from 1-5% so I'd say that
they are basically equivalent Benchmark wise. I'd say the
difference you see is either a poorer split implementation
or a variation in how the OS's deal with memory allocation
and paging. And, I'd stop worrying about it and start coding
the way you like.
#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese);
use vars qw($d $e @t);
$d = <DATA>;
my @e = split " ", $d;
$e= \@e;
sub sss {
my $q=shift;
return (split m/ /, $q)
}
sub aaa {my $q=shift; return @$q}
print $d,$/,sss($d),$/,aaa($e),$/;
cmpthese ( -10,
{
split=> '@t = sss($d)',
arref=> '@t = aaa($e)',
});
__DATA__
a b c d e f g h i j k l m n o p q r s t u v w x y z
--
$you = new YOU;
honk() if $you->love(perl) |