# the fix:
@items = grep {
my $keep = !exists $del{$_};
$i++;
$index -= ($i < $index) unless $keep;
$keep
} @items;
# the results
Benchmark: timing 100000 iterations of BrowserUk, dpuu...
BrowserUk: 13 wallclock secs (13.72 usr + 0.00 sys = 13.72 CPU) @ 7288.63/s (n=100000)
dpuu: 10 wallclock secs ( 9.88 usr + 0.00 sys = 9.88 CPU) @ 10117.36/s (n=100000)
Rate BrowserUk dpuu
dpuu 10117/s 39% --
BrowserUk 7289/s -- -28%
####
Benchmark: timing 100000 iterations of BrowserUk, dpuu...
BrowserUk: 10 wallclock secs ( 9.26 usr + 0.00 sys = 9.26 CPU) @ 10795.64/s (n=100000)
dpuu: 10 wallclock secs ( 9.87 usr + 0.01 sys = 9.88 CPU) @ 10118.39/s (n=100000)
Rate dpuu BrowserUk
dpuu 10118/s -- -6%
BrowserUk 10796/s 7% --
####
@items = grep { ++$i && !exists $del{$_} || ($index -= $i-1 <= $index) && 0 } @items;