use strict; use warnings; use Benchmark qw(:all); my @states= ( 'alabama', 'alaska', 'arizona', 'arkansas', 'california', 'colorado', 'connecticut', 'delaware', 'florida', 'georgia', 'hawaii', 'idaho', 'illinois', 'indiana', 'iowa', 'kansas', 'kentucky', 'louisiana', 'maine', 'maryland', 'massachusetts', 'michigan', 'minnesota', 'mississippi', 'missouri', 'montana', 'nebraska', 'nevada', 'newhampshire', 'newjersey', 'newmexico', 'newyork', 'northcarolina', 'northdakota', 'ohio', 'oklahoma', 'oregon', 'pennsylvania', 'rhodeisland', 'southcarolina', 'southdakota', 'tennessee', 'texas', 'utah', 'vermont', 'virginia', 'washington', 'westvirginia', 'wisconsin', 'wyoming', ); my %states= ( AL=>'alabama', AK=>'alaska', AZ=>'arizona', AR=>'arkansas', CA=>'california', CO=>'colorado', CT=>'connecticut', DE=>'delaware', FL=>'florida', GA=>'georgia', HI=>'hawaii', ID=>'idaho', IL=>'illinois', IN=>'indiana', IA=>'iowa', KS=>'kansas', KY=>'kentucky', LA=>'louisiana', ME=>'maine', MD=>'maryland', MA=>'massachusetts', MI=>'michigan', MN=>'minnesota', MS=>'mississippi', MO=>'missouri', MT=>'montana', NE=>'nebraska', NV=>'nevada', NH=>'new hampshire', NJ=>'new jersey', NM=>'new mexico', NY=>'new york', NC=>'north carolina', ND=>'north dakota', OH=>'ohio', OK=>'oklahoma', OR=>'oregon', PA=>'pennsylvania', RI=>'rhode island', SC=>'south carolina', SD=>'south dakota', TN=>'tennessee', TX=>'texas', UT=>'utah', VT=>'vermont', VA=>'virginia', WA=>'washington', WV=>'west virginia', WI=>'wisconsin', WY=>'wyoming', ); sub teststatehash { my %x; for my $x (sort keys %states) { for my $y (sort keys %states) { last if $y ge $x; my $ref= join '', sort grep { $_ ne ' ' } split //, $states{$x}.$states{$y}; push @{$x{$ref}}, "$x.$y"; } } for my $r (keys %x) { next if @{$x{$r}}==1; #printf("%-40s: %s\n", $r, join(", ", @{$x{$r}})); return 1; } } sub teststatearray { my %sigmap; for (my $x=0 ; $x<@states ; $x++) { for (my $y= $x+1 ; $y<@states ; $y++) { my $signature= join '', sort split //, $states[$x].$states[$y]; if ($sigmap{$signature}) { #printf("%s:%s .. %s:%s\n", $states[$x], $states[$y], @states[@{$sigmap{$signature}}]); return 1; } $sigmap{$signature}=[$x,$y]; } } } cmpthese(1000, { 'teststatehash' => \&teststatehash, 'teststatearray' => \&teststatearray, }); =end Rate teststatehash teststatearray teststatehash 11.1/s -- -21% teststatearray 14.0/s 26% --