sub remove_items { my ($i, %del) = (0); @del{@_} = undef; @items = grep { !exists $del{$_} and ++$i or $index -= ($i <= $index), 0 } @items; } #### #! 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 <= $index), 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 @dups; }, dpuu => sub { @items = @i; $index=$start; remove_item @dups; }, }); } __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) @ 2083.33/s (n=1000) dpuu: 1 wallclock secs ( 0.63 usr + 0.00 sys = 0.63 CPU) @ 1587.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) @ 2123.14/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2123.14/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2036.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1538.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) @ 2083.33/s (n=1000) dpuu: 1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 1512.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) @ 2036.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2036.66/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2083.33/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2036.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2079.00/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2079.00/s (n=1000) dpuu: 0 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1562.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) @ 2036.66/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2079.00/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 1996.01/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2083.33/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2036.66/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2079.00/s (n=1000) dpuu: 0 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2040.82/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2123.14/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2036.66/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 1996.01/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2083.33/s (n=1000) dpuu: -1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2079.00/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2123.14/s (n=1000) dpuu: 1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 1512.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) @ 2083.33/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2036.66/s (n=1000) dpuu: 0 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2079.00/s (n=1000) dpuu: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2083.33/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1562.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) @ 1996.01/s (n=1000) dpuu: 0 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536.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) @ 2079.00/s (n=1000) dpuu: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1560.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) @ 2123.14/s (n=1000) dpuu: 0 wallclock secs ( 0.62 usr + 0.00 sys = 0.62 CPU) @ 1612.90/s (n=1000) Rate dpuu BrowserUk dpuu 1613/s -- -24% BrowserUk 2123/s 32% -- C:\test>