#! perl -w use strict; use Benchmark qw(cmpthese); sub intersect (\@\@) { my ($aryRef1, $aryRef2) = @_; my %count; $count{$_}++ foreach @$aryRef1, @$aryRef2; return grep{ $count{$_} == 1 } keys %count; } my @array1 = (1 .. 28000); my @array2 = (1..1000, 1..100); # create some duplicates with duplicates my %hashBase; @hashBase{@array1} = undef; sub faq { my @dup = intersect( @array1, @array2 ); } sub hash { my %hashAry; @hashAry{@array1} = undef; my @dup = delete @hashAry{@array2}; } sub prehash { my %hashAry = %hashBase; my @dup = delete @hashAry{@array2}; } sub hash_lret { my %hashAry; @hashAry{@array1} = undef; my @dup = delete @hashAry{@array2}; return keys %hashAry; } sub prehash_lret { my %hashAry = %hashBase; my @dup = delete @hashAry{@array2}; return keys %hashAry; } sub grepped { my %reject; $reject{$_} = 1 for @array2; my @clean=grep !$reject{$_}, @array1; } cmpthese 100,{ faq => \&faq, hash => \&hash, prehash => \&prehash, hash_lret => \&hash_lret, prehash_lret => \&prehash_lret, grepped => \&grepped, };