On Thu, Mar 13, 2008 at 9:02 AM, Jenda Krynicky <[EMAIL PROTECTED]> wrote:
snip
> right
> @a = (pop(@a), @a);
>
> left
> @a = (@a[1..$#a], $a[0]);
snip
These are O(n) operations and are fine if n is small, but the push/shift and
unshift/pop implementations are O(1). Of course, the push/shift and
unshift/pop versions are destructive, so you may need to use these if you
aren't assigning back to the same array (which would be O(n) anyway so there
wouldn't be a noticeable performance hit).
test with ten elements
left_push_shift [2] [3] [4] [5] [6] [7] [8] [9] [1]
left_slice [2] [3] [4] [5] [6] [7] [8] [9] [1]
right_slice [9] [1] [2] [3] [4] [5] [6] [7] [8]
right_unshift_pop [9] [1] [2] [3] [4] [5] [6] [7] [8]
results for n of 10
Rate left_slice right_slice right_unshift_pop
left_push_shift
left_slice 297890/s -- -36% -92%
-93%
right_slice 463698/s 56% -- -87%
-89%
right_unshift_pop 3574691/s 1100% 671% --
-13%
left_push_shift 4111294/s 1280% 787% 15%
--
results for n of 100
Rate left_slice right_slice right_unshift_pop
left_push_shift
left_slice 36885/s -- -34% -99%
-99%
right_slice 55854/s 51% -- -98%
-99%
right_unshift_pop 3300471/s 8848% 5809% --
-22%
left_push_shift 4249037/s 11420% 7507% 29%
--
results for n of 1000
Rate left_slice right_slice right_unshift_pop
left_push_shift
left_slice 3459/s -- -37% -100%
-100%
right_slice 5493/s 59% -- -100%
-100%
right_unshift_pop 3247802/s 93806% 59024% --
-14%
left_push_shift 3780922/s 109221% 68729% 16%
--
results for n of 10000
Rate left_slice right_slice right_unshift_pop
left_push_shift
left_slice 352/s -- -38% -100%
-100%
right_slice 565/s 61% -- -100%
-100%
right_unshift_pop 3276799/s 931108% 580055% --
-13%
left_push_shift 3776122/s 1073007% 668459% 15%
--
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
my @a;
my %subs = (
left_push_shift => sub { push @a, shift @a; return 0 },
left_slice => sub { @a = (@a[1..$#a], $a[0]); return 0 },
right_unshift_pop => sub { unshift @a, pop @a; return 0 },
right_slice => sub { @a = (pop @a, @a); return 0 },
);
print "test with ten elements\n";
for my $sub (sort keys %subs) {
@a = 1 .. 9;
$subs{$sub}->();
printf "%-20s %s\n", $sub, join " ", map {"[$_]"} @a;
}
for my $n (10, 100, 1_000, 10_000) {
@a = 1 .. $n;
print "results for n of $n\n";
Benchmark::cmpthese(-1, \%subs);
}
--
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.