use v5.12; use warnings; use Test::More; use Benchmark qw/cmpthese/; my $AoH; my $density = 75; for my $n_rec (1, 10, 100, 1000) { say ""; say "=== num of records is: ", $n_rec, " duplication: $density%"; $AoH = create_data ($density, $n_rec); is_deeply ( [ sort &list_join ], [ sort &slice_join ], ); is_deeply ( [ sort &grep_map ], [ sort &slice_join ], ); is_deeply ( [ sort &map_map ], [ sort &slice_join ], ); cmpthese ( -1, { map_map => \&map_map, grep_map => \&grep_map, list_join => \&list_join, slice_join => \&slice_join, }); } done_testing; sub list_join { my %H; %H = (%H, %$_) for @$AoH; return keys %H; } # list_join sub slice_join { my %H; @H{keys %$_} = () for @$AoH; return keys %H; } # slice_join sub grep_map { my %seen; return grep { !$seen{$_}++ } map { keys %$_ } @$AoH; } # grep_map sub map_map { my %H = map { $_ => 1 } map { keys %$_ } @$AoH; return keys %H; } # map_map sub create_data { my ($density, $records) = @_; my @AoH; push @AoH, {map { rand 100 <= $density ? ( $_ => $_ ) : () } "A" .. "ZZ"} for 1 .. $records; return \@AoH; }