10 rand.Seed(time.Now().Unix())
13 func BenchmarkARC_Rand(b *testing.B) {
14 l, err := NewARC(8192)
16 b.Fatalf("err: %v", err)
19 trace := make([]int64, b.N*2)
20 for i := 0; i < b.N*2; i++ {
21 trace[i] = rand.Int63() % 32768
27 for i := 0; i < 2*b.N; i++ {
29 l.Add(trace[i], trace[i])
31 _, ok := l.Get(trace[i])
39 b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
42 func BenchmarkARC_Freq(b *testing.B) {
43 l, err := NewARC(8192)
45 b.Fatalf("err: %v", err)
48 trace := make([]int64, b.N*2)
49 for i := 0; i < b.N*2; i++ {
51 trace[i] = rand.Int63() % 16384
53 trace[i] = rand.Int63() % 32768
59 for i := 0; i < b.N; i++ {
60 l.Add(trace[i], trace[i])
63 for i := 0; i < b.N; i++ {
64 _, ok := l.Get(trace[i])
71 b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
74 func TestARC_RandomOps(t *testing.T) {
78 t.Fatalf("err: %v", err)
82 for i := 0; i < n; i++ {
83 key := rand.Int63() % 512
94 if l.t1.Len()+l.t2.Len() > size {
95 t.Fatalf("bad: t1: %d t2: %d b1: %d b2: %d p: %d",
96 l.t1.Len(), l.t2.Len(), l.b1.Len(), l.b2.Len(), l.p)
98 if l.b1.Len()+l.b2.Len() > size {
99 t.Fatalf("bad: t1: %d t2: %d b1: %d b2: %d p: %d",
100 l.t1.Len(), l.t2.Len(), l.b1.Len(), l.b2.Len(), l.p)
105 func TestARC_Get_RecentToFrequent(t *testing.T) {
106 l, err := NewARC(128)
108 t.Fatalf("err: %v", err)
111 // Touch all the entries, should be in t1
112 for i := 0; i < 128; i++ {
115 if n := l.t1.Len(); n != 128 {
116 t.Fatalf("bad: %d", n)
118 if n := l.t2.Len(); n != 0 {
119 t.Fatalf("bad: %d", n)
122 // Get should upgrade to t2
123 for i := 0; i < 128; i++ {
126 t.Fatalf("missing: %d", i)
129 if n := l.t1.Len(); n != 0 {
130 t.Fatalf("bad: %d", n)
132 if n := l.t2.Len(); n != 128 {
133 t.Fatalf("bad: %d", n)
137 for i := 0; i < 128; i++ {
140 t.Fatalf("missing: %d", i)
143 if n := l.t1.Len(); n != 0 {
144 t.Fatalf("bad: %d", n)
146 if n := l.t2.Len(); n != 128 {
147 t.Fatalf("bad: %d", n)
151 func TestARC_Add_RecentToFrequent(t *testing.T) {
152 l, err := NewARC(128)
154 t.Fatalf("err: %v", err)
157 // Add initially to t1
159 if n := l.t1.Len(); n != 1 {
160 t.Fatalf("bad: %d", n)
162 if n := l.t2.Len(); n != 0 {
163 t.Fatalf("bad: %d", n)
166 // Add should upgrade to t2
168 if n := l.t1.Len(); n != 0 {
169 t.Fatalf("bad: %d", n)
171 if n := l.t2.Len(); n != 1 {
172 t.Fatalf("bad: %d", n)
175 // Add should remain in t2
177 if n := l.t1.Len(); n != 0 {
178 t.Fatalf("bad: %d", n)
180 if n := l.t2.Len(); n != 1 {
181 t.Fatalf("bad: %d", n)
185 func TestARC_Adaptive(t *testing.T) {
188 t.Fatalf("err: %v", err)
192 for i := 0; i < 4; i++ {
195 if n := l.t1.Len(); n != 4 {
196 t.Fatalf("bad: %d", n)
202 if n := l.t2.Len(); n != 2 {
203 t.Fatalf("bad: %d", n)
208 if n := l.b1.Len(); n != 1 {
209 t.Fatalf("bad: %d", n)
213 // t1 : (MRU) [4, 3] (LRU)
214 // t2 : (MRU) [1, 0] (LRU)
215 // b1 : (MRU) [2] (LRU)
216 // b2 : (MRU) [] (LRU)
218 // Add 2, should cause hit on b1
220 if n := l.b1.Len(); n != 1 {
221 t.Fatalf("bad: %d", n)
224 t.Fatalf("bad: %d", l.p)
226 if n := l.t2.Len(); n != 3 {
227 t.Fatalf("bad: %d", n)
231 // t1 : (MRU) [4] (LRU)
232 // t2 : (MRU) [2, 1, 0] (LRU)
233 // b1 : (MRU) [3] (LRU)
234 // b2 : (MRU) [] (LRU)
236 // Add 4, should migrate to t2
238 if n := l.t1.Len(); n != 0 {
239 t.Fatalf("bad: %d", n)
241 if n := l.t2.Len(); n != 4 {
242 t.Fatalf("bad: %d", n)
246 // t1 : (MRU) [] (LRU)
247 // t2 : (MRU) [4, 2, 1, 0] (LRU)
248 // b1 : (MRU) [3] (LRU)
249 // b2 : (MRU) [] (LRU)
251 // Add 4, should evict to b2
253 if n := l.t1.Len(); n != 1 {
254 t.Fatalf("bad: %d", n)
256 if n := l.t2.Len(); n != 3 {
257 t.Fatalf("bad: %d", n)
259 if n := l.b2.Len(); n != 1 {
260 t.Fatalf("bad: %d", n)
264 // t1 : (MRU) [5] (LRU)
265 // t2 : (MRU) [4, 2, 1] (LRU)
266 // b1 : (MRU) [3] (LRU)
267 // b2 : (MRU) [0] (LRU)
269 // Add 0, should decrease p
271 if n := l.t1.Len(); n != 0 {
272 t.Fatalf("bad: %d", n)
274 if n := l.t2.Len(); n != 4 {
275 t.Fatalf("bad: %d", n)
277 if n := l.b1.Len(); n != 2 {
278 t.Fatalf("bad: %d", n)
280 if n := l.b2.Len(); n != 0 {
281 t.Fatalf("bad: %d", n)
284 t.Fatalf("bad: %d", l.p)
288 // t1 : (MRU) [] (LRU)
289 // t2 : (MRU) [0, 4, 2, 1] (LRU)
290 // b1 : (MRU) [5, 3] (LRU)
291 // b2 : (MRU) [0] (LRU)
294 func TestARC(t *testing.T) {
295 l, err := NewARC(128)
297 t.Fatalf("err: %v", err)
300 for i := 0; i < 256; i++ {
304 t.Fatalf("bad len: %v", l.Len())
307 for i, k := range l.Keys() {
308 if v, ok := l.Get(k); !ok || v != k || v != i+128 {
309 t.Fatalf("bad key: %v", k)
312 for i := 0; i < 128; i++ {
315 t.Fatalf("should be evicted")
318 for i := 128; i < 256; i++ {
321 t.Fatalf("should not be evicted")
324 for i := 128; i < 192; i++ {
328 t.Fatalf("should be deleted")
334 t.Fatalf("bad len: %v", l.Len())
336 if _, ok := l.Get(200); ok {
337 t.Fatalf("should contain nothing")
341 // Test that Contains doesn't update recent-ness
342 func TestARC_Contains(t *testing.T) {
345 t.Fatalf("err: %v", err)
351 t.Errorf("1 should be contained")
356 t.Errorf("Contains should not have updated recent-ness of 1")
360 // Test that Peek doesn't update recent-ness
361 func TestARC_Peek(t *testing.T) {
364 t.Fatalf("err: %v", err)
369 if v, ok := l.Peek(1); !ok || v != 1 {
370 t.Errorf("1 should be set to 1: %v, %v", v, ok)
375 t.Errorf("should not have updated recent-ness of 1")