use strict; use warnings; use feature 'say'; use Data::Dump; use Time::HiRes 'time'; use Digest::xxHash; use Algorithm::Combinatorics 'combinations'; srand( 1122 ); my $len = 1000; my $vol = 2000; my @data = map { join '', map { chr rand 256 } 1 .. $len; } 1 .. $vol; # add some duplication @data = ( @data, ( grep { rand > .8 } @data ), ( grep { rand > .4 } @data ), ( grep { rand > .2 } @data ), ); my %h1; my %h2; sub do_something {}; ########################### my $t = time; for my $i ( 0 .. $#data ) { for my $j ( $i + 1 .. $#data ) { do_something( $i, $j ) if $data[ $i ] eq $data[ $j ] } } say time - $t; ########################### $t = time; push @{ $h2{ $data[ $_ ]}}, $_ for 0 .. $#data; for ( grep { @$_ > 1 } values %h2 ) { do_something( @$_ ) for combinations( $_, 2 ) } say time - $t; __END__ 1.1641149520874 0.022386074066162