Your right. My code, both my offered solution and my benchmark, are deficient. I'll keep my excuses and offer a revised solution, which I believe I have fully verified for compatability with the results of your original.
The code below runs the remove_item(s) subs against the test data for all possible $index values and compares the results against each other (yours and mine). It also benchmarks each for all input criteria and the results are that my new version now averages a tad under a third (32.9%) faster across all situations.
I hope you find this useful.
sub remove_items { my ($i, %del) = (0); @del{@_} = undef; @items = grep { !exists $del{$_} and ++$i or $index -= ($i <= $index), 0 } @items; }
The code for the full verification and the benchmark result (on my poor li'l 233MHz :) are below
#! perl -sw use strict; use Benchmark; my @i = qw( a b c x d e f a g h i j k l z m n o p q r t s t b u v w x +y z ); my @dups = qw( x a z t b ); my $index; my @items = @i; sub remove_item { my %del = map { $_ => 1 } @_; my @part_1 = grep { !exists $del{$_} } @items[0..$index]; my @part_2 = grep { !exists $del{$_} } @items[$index+1..$#items]; $index = $#part_1; @items = (@part_1, @part_2); } sub remove_items { my ($i, %del) = (0); @del{@_} = undef; @items = grep { !exists $del{$_} and ++$i or $index -= ($i <= $ind +ex), 0 } @items; } for my $start ( 0..$#items ) { @items = @i; $index=$start; remove_item @dups; my $dpuuResults = "$index:$items[$index]:@items\n"; @items = @i; $index=$start; remove_items @dups; my $BUKResults = "$index:$items[$index]:@items\n"; print "Mismatch: dpuu gave:\n$dpuuResults\nBUK gave: $BUKResults\n +" if $dpuuResults ne $BUKResults; Benchmark::cmpthese( 1000, { BrowserUk => sub { @items = @i; $index=$start; remove_items @dup +s; }, dpuu => sub { @items = @i; $index=$start; remove_item @du +ps; }, }); } __DATA__ C:\test>195796 30 Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: 1 wallclock secs ( 0.63 usr + 0.00 sys = 0.63 CPU) @ 15 +87.30/s (n=1000) Rate dpuu BrowserUk dpuu 1587/s -- -24% BrowserUk 2083/s 31% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.47 usr + 0.00 sys = 0.47 CPU) @ 21 +23.14/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -28% BrowserUk 2123/s 38% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.47 usr + 0.00 sys = 0.47 CPU) @ 21 +23.14/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -28% BrowserUk 2123/s 38% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +38.46/s (n=1000) Rate dpuu BrowserUk dpuu 1538/s -- -24% BrowserUk 2037/s 32% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: 1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 15 +12.86/s (n=1000) Rate dpuu BrowserUk dpuu 1513/s -- -27% BrowserUk 2083/s 38% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -25% BrowserUk 2037/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -25% BrowserUk 2037/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -26% BrowserUk 2083/s 36% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -25% BrowserUk 2037/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -26% BrowserUk 2079/s 35% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 0 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +62.50/s (n=1000) Rate dpuu BrowserUk dpuu 1562/s -- -25% BrowserUk 2079/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -23% BrowserUk 2037/s 31% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -26% BrowserUk 2079/s 35% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.50 usr + 0.00 sys = 0.50 CPU) @ 19 +96.01/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -22% BrowserUk 1996/s 28% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -25% BrowserUk 2083/s 34% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -23% BrowserUk 2037/s 31% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 0 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -25% BrowserUk 2079/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +40.82/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -24% BrowserUk 2041/s 31% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.47 usr + 0.00 sys = 0.47 CPU) @ 21 +23.14/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -28% BrowserUk 2123/s 38% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -25% BrowserUk 2037/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.50 usr + 0.00 sys = 0.50 CPU) @ 19 +96.01/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -22% BrowserUk 1996/s 28% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: -1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -25% BrowserUk 2083/s 34% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -26% BrowserUk 2079/s 35% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.47 usr + 0.00 sys = 0.47 CPU) @ 21 +23.14/s (n=1000) dpuu: 1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 15 +12.86/s (n=1000) Rate dpuu BrowserUk dpuu 1513/s -- -29% BrowserUk 2123/s 40% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -26% BrowserUk 2083/s 36% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 20 +36.66/s (n=1000) dpuu: 0 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -23% BrowserUk 2037/s 31% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -26% BrowserUk 2079/s 35% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +83.33/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +62.50/s (n=1000) Rate dpuu BrowserUk dpuu 1562/s -- -25% BrowserUk 2083/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 0 wallclock secs ( 0.50 usr + 0.00 sys = 0.50 CPU) @ 19 +96.01/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15 +36.10/s (n=1000) Rate dpuu BrowserUk dpuu 1536/s -- -23% BrowserUk 1996/s 30% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 20 +79.00/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +60.06/s (n=1000) Rate dpuu BrowserUk dpuu 1560/s -- -25% BrowserUk 2079/s 33% -- Benchmark: timing 1000 iterations of BrowserUk, dpuu... BrowserUk: 1 wallclock secs ( 0.47 usr + 0.00 sys = 0.47 CPU) @ 21 +23.14/s (n=1000) dpuu: 0 wallclock secs ( 0.62 usr + 0.00 sys = 0.62 CPU) @ 16 +12.90/s (n=1000) Rate dpuu BrowserUk dpuu 1613/s -- -24% BrowserUk 2123/s 32% -- C:\test>
In reply to Re: Re: Re: round-robin on varying sequence
by BrowserUk
in thread round-robin on varying sequence
by dpuu
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |