#! perl -slw use strict; use Benchmark qw[ cmpthese ]; our $N ||= 100; our $SHOW; sub barvin { my ($in, $jn) = @_; my (%int, %uni); for my $i (@$in) { $uni{$i}++; } for my $j (@$jn) { $int{$j}++ if $uni{$j}; $uni{$j}++; } print 'barvin: ', ((scalar keys %int), ' : ', (scalar keys %uni)) if $SHOW; return ((scalar keys %int), (scalar keys %uni)); } sub buk{ my( $aRef, $bRef ) = @_; my( $aBits, $bBits ) = ('') x 2; vec( $aBits, $_, 1 ) = 1 for @$aRef; vec( $bBits, $_, 1 ) = 1 for @$bRef; my $uCount = unpack '%32b*', ( $aBits | $bBits ); my $iCount = unpack '%32b*', ( $aBits & $bBits ); print 'buk: ', $iCount, ' : ', $uCount if $SHOW; return( $iCount, $uCount ); } our @a = map int( rand $N * 1.5 ), 1 .. $N; our @b = map int( rand $N * 1.5 ), 1 .. $N; print "@{[ sort { $a <=> $b } @a ]}\n@{[ sort{ $a <=> $b } @b ]}\n" if $SHOW; cmpthese $SHOW ? 1 : -1, { barvin => q[ our( @a, @b ); barvin( \@a, \@b ); ], buk => q[ our( @a, @b ); buk( \@a, \@b ); ], }; __END__ c:\test>unionIntersect -N=10 Rate barvin buk barvin 33212/s -- -29% buk 47045/s 42% -- c:\test>unionIntersect -N=100 Rate barvin buk barvin 4111/s -- -53% buk 8777/s 113% -- c:\test>unionIntersect -N=1000 Rate barvin buk barvin 357/s -- -64% buk 998/s 179% --