1use strict;
2use warnings;
3
4use Benchmark qw(:all);
5use Cache::FastMmap;
6use Cache::LRU;
7use Cache::Ref::LRU;
8use Cache::Ref::Util::LRU::Array;
9use Cache::Ref::Util::LRU::List;
10use Tie::Cache::LRU;
11
12my $size = 1024;
13my $loop = 1000;
14
15sub cache_hit {
16    my $cache = shift;
17    $cache->set(a => 1);
18    my $c = 0;
19    $c += $cache->get('a')
20        for 1..$loop;
21    $c;
22}
23
24print "cache_hit:\n";
25cmpthese(-1, {
26    'Cache::FastMmap' => sub {
27        cache_hit(
28            Cache::FastMmap->new(
29                cache_size => '1m',
30            ),
31        );
32    },
33    'Cache::FastMmap (raw)' => sub {
34        cache_hit(
35            Cache::FastMmap->new(
36                cache_size => '1m',
37                raw_values => 1,
38            ),
39        );
40    },
41    'Cache::LRU' => sub {
42        cache_hit(
43            Cache::LRU->new(
44                size => $size,
45            ),
46        );
47    },
48    'Cache::Ref::LRU (Array)' => sub {
49        cache_hit(
50            Cache::Ref::LRU->new(
51                size      => $size,
52                lru_class => qw(Cache::Ref::Util::LRU::Array),
53            ),
54        );
55    },
56    'Cache::Ref::LRU (List)'  => sub {
57        cache_hit(
58            Cache::Ref::LRU->new(
59                size      => $size,
60                lru_class => qw(Cache::Ref::Util::LRU::List),
61            ),
62        );
63    },
64    'Tie::Cache::LRU' => sub {
65        tie my %cache, 'Tie::Cache::LRU', $size;
66        $cache{a} = 1;
67        my $c = 0;
68        $c += $cache{a}
69            for 1..$loop;
70        $c;
71    },
72});
73
74print "\ncache_set:\n";
75srand(0);
76my @keys = map { int rand(1048576) } 1..65536;
77
78sub cache_set {
79    my $cache = shift;
80    $cache->set($_ => 1)
81        for @keys;
82    $cache;
83}
84
85cmpthese(-1, {
86    # no test for Cache::FastMmap since it does not have the "size" parameter
87    'Cache::LRU' => sub {
88        cache_set(
89            Cache::LRU->new(
90                size => $size,
91            ),
92        );
93    },
94    # too slow
95    #'Cache::Ref::LRU (Array)' => sub {
96    #    cache_set(
97    #        Cache::Ref::LRU->new(
98    #            size      => $size,
99    #            lru_class => qw(Cache::Ref::Util::LRU::Array),
100    #        ),
101    #    );
102    #},
103    'Cache::Ref::LRU (List)' => sub {
104        cache_set(
105            Cache::Ref::LRU->new(
106                size      => $size,
107                lru_class => qw(Cache::Ref::Util::LRU::List),
108            ),
109        );
110    },
111    'Tie::Cache::LRU' => sub {
112        tie my %cache, 'Tie::Cache::LRU', $size;
113        $cache{$_} = 1
114            for @keys;
115        \%cache;
116    },
117});
118