Data-HashMap-Shared

 view release on metacpan or  search on metacpan

eg/memoize.pl  view on Meta::CPAN

# Compute-once shared cache. Many workers need the same expensive results;
# get_or_set stores each key's value once and hands every caller -- even ones
# racing to compute it -- the same stored result.

my $path  = "/tmp/dhms_memoize_$$.shm";
my $cache = Data::HashMap::Shared::IS->new($path, 1000);

sub expensive {                       # pretend this is slow / costly
    my $n = shift;
    my $r = 0;
    $r += $_ for 1 .. ($n + 1) * 1000;   # busywork
    return "f($n)=$r";
}

sub memoized {
    my ($c, $n) = @_;
    my $hit = shm_is_get $c, $n;
    return $hit if defined $hit;                  # fast path: already cached
    # miss: compute, then get_or_set so the first writer wins any race and
    # every caller observes the same value
    return shm_is_get_or_set $c, $n, expensive($n);



( run in 1.109 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )