Skip to content

Commit

Permalink
Add hash methods to compare
Browse files Browse the repository at this point in the history
  • Loading branch information
yannk committed Oct 13, 2009
1 parent 4d87257 commit 7d16b83
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 1 deletion.
31 changes: 30 additions & 1 deletion lib/Data/Layered.pm
Expand Up @@ -7,7 +7,7 @@ use Exporter;
use vars qw(@ISA @EXPORT_OK); use vars qw(@ISA @EXPORT_OK);


@ISA = qw(Exporter); @ISA = qw(Exporter);
@EXPORT_OK = qw(layered_get); @EXPORT_OK = qw(layered_get layered_get2 layered_get3);


=encoding utf-8 =encoding utf-8
Expand Down Expand Up @@ -109,6 +109,35 @@ sub layered_get {
return \@results; return \@results;
} }


sub layered_get2 {
my ($class) = @_;
shift() unless ref $class;
my ($keys, $layers) = @_;

## degenerated cases
return {} unless $keys;
return $keys unless $layers;

my %results = ();
my @need_keys = @$keys;

for my $layer (@$layers) {
$layer->(\@need_keys, \%results);

# keys which have been resolved will have a key in %results
# the rest will need to be attempted at the next layer
@need_keys = grep { ! exists $results{$_} } @need_keys;
}

return \%results;
}

sub layered_get3 {
my $keys = $_[0];
my $res = layered_get2(@_);
return [ map { $res->{$_} } @$keys ];
}

=head1 AUTHOR =head1 AUTHOR
Yann Kerherve E<lt>yannk@cpan.orgE<gt> Yann Kerherve E<lt>yannk@cpan.orgE<gt>
Expand Down
51 changes: 51 additions & 0 deletions t/02_bench.t
@@ -0,0 +1,51 @@
use Find::Lib '../lib';
use strict;
use warnings;
use Benchmark 'timethese';

use Data::Layered 'layered_get', 'layered_get2', 'layered_get3';

## define some caches
my $L1 = {};
my $L2 = {};
my $keys = [];
for (1 .. 50000) {
$L1->{ int rand (100000) } = int rand (1000);
$L2->{ int rand (100000) } = int rand (1000);
push @$keys, int rand (100000);
}
my %seen;
@$keys = grep { ! $seen{$_}++ } @$keys;

my $l1 = sub { [ @$L1{ @{$_[0]} } ] };
my $l2 = sub { [ @$L2{ @{$_[0]} } ] };

my $l1_2 = sub {
my ($keys, $res) = @_;
for my $k (@$keys) {
$res->{$k} = $L1->{$k};
}
};

my $l2_2 = sub {
my ($keys, $res) = @_;
for my $k (@$keys) {
$res->{$k} = $L2->{$k};
}
};

timethese 5, {
layered_get => sub {
my $res = layered_get( $keys, [ $l1, $l2 ]);
#warn scalar grep { defined } @$res;
},
layered_get2 => sub {
my $res = layered_get2( $keys, [ $l1_2, $l2_2 ]);
#warn scalar grep { defined $res->{$_} } keys %$res;
},

layered_get3 => sub {
my $res = layered_get3( $keys, [ $l1_2, $l2_2 ]);
#warn scalar grep { defined $res->{$_} } keys %$res;
},
};

0 comments on commit 7d16b83

Please sign in to comment.