I ran some benchmarks:
I used the previous code but added the "shift" case to the @array.
Update:When dealing with an @thing variable in Perl, using shift is an extremely efficient way to get the "top of the list". The benchmarks below show that. I got a comment that indicated that somebody didn't believe that, well check it out for yourself. But again, this is not about reading characters, it must or seems to be Perl's power is about recognizing pattern matches!
#!/usr/bin/perl -w
use strict;
use Benchmark qw[ cmpthese timethese];
my $string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaa';
my @chars=split //,$string;
cmpthese
( 1000000,
{
'Substr'=>sub
{
my $string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaa';
for (my $i=0;$i<length $string; $i++)
{
my $char=substr $string,$i,1;
}
},
'pre_splitted'=>sub
{
foreach my $char (@chars) {}
},
'Split'=>sub
{
my @string=split //,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
foreach my $char (@string) {}
},
'Shift'=>sub
{
my @string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaa';
shift @string;{}
}
}
);
__END__
prints:
Rate Split Substr pre_splitted Shift
Split 8840/s -- -72% -94% -99%
Substr 31465/s 256% -- -78% -95%
pre_splitted 140667/s 1491% 347% -- -80%
Shift 695410/s 7767% 2110% 394% --