#!/usr/bin/perl
use strict;
use Benchmark qw/cmpthese/;
use List::Util qw/shuffle/;
# ARGV[0], if present, sets array size
# ARGV[1], if present, sets max value of integer range
my $nelem = 9;
my $upper = 9;
$nelem = shift if ( @ARGV and $ARGV[0] =~ /^\d+$/ );
$upper = shift if ( @ARGV and $ARGV[0] =~ /^\d+$/ );
die "Usage: $0 array_size max_value\n (min_value is always 1)\n"
if ( @ARGV );
my ( @array1, @array2 );
push @array1, int(rand($upper))+1 for ( 1..$nelem );
push @array2, int(rand($upper))+1 for ( 1..$nelem );
my %answer;
cmpthese( 100_000,
{
'hash' => \&comp_by_hash,
'sortcomp' => \&comp_by_sortcomp,
'sortjoin' => \&comp_by_sortjoin,
} );
print "\nresults: ",join(" ",map{"$_:$answer{$_}"} keys %answer),"\n\n";
@array2 = shuffle( @array1 );
cmpthese( 100_000,
{
'hash' => \&comp_by_hash,
'sortcomp' => \&comp_by_sortcomp,
'sortjoin' => \&comp_by_sortjoin,
} );
print "\nresults: ",join(" ",map{"$_:$answer{$_}"} keys %answer),"\n\n";
sub comp_by_hash {
my %h;
$h{$_}++ for ( @array1 );
$h{$_}-- for ( @array2 );
$answer{hash} = ( grep {$h{$_}!=0} keys %h ) ? 'diff' : 'same';
}
sub comp_by_sortcomp {
my @sort1 = sort @array1;
my @sort2 = sort @array2;
for ( 0..$#sort1 ) {
if( $sort1[$_] != $sort2[$_] ) {
$answer{sortcomp} = 'diff';
return;
}
}
$answer{sortcomp} = 'same';
}
sub comp_by_sortjoin {
my $j1 = join ' ', sort( @array1 );
my $j2 = join ' ', sort( @array2 );
$answer{sortjoin} = ( $j1 eq $j2 ) ? 'same':'diff';
}
####
$ test.pl
Rate sortcomp hash sortjoin
sortcomp 20202/s -- -0% -58%
hash 20243/s 0% -- -58%
sortjoin 48077/s 138% 137% --
results: hash:diff sortjoin:diff sortcomp:diff
Rate sortcomp hash sortjoin
sortcomp 17857/s -- -26% -63%
hash 24213/s 36% -- -50%
sortjoin 48544/s 172% 100% --
results: hash:same sortjoin:same sortcomp:same
####
test.pl 90 ## array size = 90 (lots of repeat values)
Rate sortcomp sortjoin hash
sortcomp 2199/s -- -53% -61%
sortjoin 4645/s 111% -- -18%
hash 5653/s 157% 22% --
results: hash:diff sortjoin:diff sortcomp:diff
Rate sortcomp sortjoin hash
sortcomp 1907/s -- -59% -66%
sortjoin 4684/s 146% -- -17%
hash 5659/s 197% 21% --
results: hash:same sortjoin:same sortcomp:same