in reply to Re^2: Convert string to array - performance challenge
in thread Convert string to array - performance challenge

Added one more test case
my %tests = ( split => q{ my @a = split //, $buf; }, regex => q{ my @a = $buf =~ /./sg; }, unpack_C => q{ my @a = map chr, unpack 'C*', $buf; }, unpack_a => q{ my @a = unpack '(a)*', $buf; }, rev_chop => q{ my @a = reverse map chop($buf), 1..length($buf); }, chop => q{ my @a; $a[ $_ ] = chop $buffer for length($buffer) .. 0; + }, );
And result was
Rate rev_chop unpack_C split regex unpack_a chop rev_chop 17.6/s -- -6% -13% -20% -30% -100% unpack_C 18.7/s 6% -- -7% -15% -25% -100% split 20.2/s 15% 8% -- -8% -20% -100% regex 22.0/s 25% 17% 9% -- -13% -100% unpack_a 25.1/s 43% 34% 24% 14% -- -100% chop 68478/s 388556% 365714% 339175% 311691% 272542% --
However I am yet to read "Benchmark" so someone please explain this output. :) UPDATE: Sorry! That was a silly mistake. Thanks almut.

Replies are listed 'Best First'.
Re^4: Convert string to array - performance challenge
by almut (Canon) on Apr 08, 2010 at 06:55 UTC
     my @a; $a[ $_ ] = chop $buffer for length($buffer) .. 0;

    Unfortunately, "reversed" ranges like length($buffer) .. 0  don't work...

    print for 1..3; # 123 print for 3..1; # no output

    However, this would work, and is actually pretty fast (about the same as substr):

    my @a; for (my $i=length($buffer)-1; $i>=0; $i--) { $a[$i] = chop $buffer; } # or my @a; my $i = length($buffer); $a[--$i] = chop $buffer while $i>0;
Re^4: Convert string to array - performance challenge
by ikegami (Patriarch) on Apr 08, 2010 at 15:11 UTC

    my @a; $a[ $_ ] = chop $buffer for length($buffer) .. 0;

    You have an off-by-one error. If you could do that, it should be

    my @a; $a[ $_ ] = chop $buffer for length($buffer)-1 .. 0;

    A simple fix for the already-described problem is to use negative indexing:

    my @a; $a[ -$_ ] = chop $buffer for 1..length($buffer);