use strict;
use warnings;
use Benchmark qw(cmpthese);
use List::MoreUtils;
my @data; # AB
for ( 1 .. 1e4 ) {
push @data, int( rand 1e6 );
}
my @lines; # BU
for ( 1 .. 1e3 ) {
my $line = int( rand 1e6 );
$line .= chr(9) . int( rand 1e6 ) while length( $line ) < 4096;
push @lines, $line;
}
my @values = map {int rand 10} 1 .. 1000; # GF
my $data;
$data = \@data;
#$data = \@lines;
#$data = \@values;
sub uniq1 { # copied from List::MoreUtils
my %h;
map { $h{$_}++ == 0 ? $_ : () } @_;
}
sub uniq2 {
my %h;
grep { $h{$_}++ == 0 } @_;
}
sub uniq3 { # OP
my %h;
grep {$h{$_} = undef} @_;
keys %h;
}
sub uniq4 { # BrowserUk
my %h;
undef @h{ @_ };
keys %h;
}
cmpthese(-1, {
'uniqM' => sub { my @uniq = List::MoreUtils::uniq(@$data) },
'uniq1' => sub { my @uniq = uniq1(@$data) },
'uniq2' => sub { my @uniq = uniq2(@$data) },
'uniq3' => sub { my @uniq = uniq3(@$data) },
'uniq4' => sub { my @uniq = uniq4(@$data) },
});
####
Rate uniq1 uniqM uniq2 uniq3 uniq4
uniq1 35.2/s -- -1% -5% -15% -21%
uniqM 35.5/s 1% -- -4% -14% -20%
uniq2 36.9/s 5% 4% -- -11% -17%
uniq3 41.5/s 18% 17% 13% -- -7%
uniq4 44.7/s 27% 26% 21% 8% --
####
Rate uniq2 uniq1 uniq3 uniq4
uniq2 34.2/s -- -4% -30% -30%
uniq1 35.5/s 4% -- -28% -28%
uniq3 49.1/s 43% 38% -- 0%
uniq4 49.1/s 43% 38% 0% --
####
Rate uniqM uniq2 uniq1 uniq3 uniq4
uniqM 24.8/s -- -28% -30% -50% -50%
uniq2 34.2/s 38% -- -4% -31% -31%
uniq1 35.5/s 43% 4% -- -28% -28%
uniq3 49.5/s 100% 45% 39% -- 0%
uniq4 49.5/s 100% 45% 39% 0% --
####
Rate uniq1 uniq2 uniq3 uniq4 uniqM
uniq1 3445/s -- -18% -27% -77% -80%
uniq2 4213/s 22% -- -10% -72% -75%
uniq3 4696/s 36% 11% -- -69% -72%
uniq4 15175/s 340% 260% 223% -- -10%
uniqM 16905/s 391% 301% 260% 11% --