public void get_reads_though()
        {
            var source = new HerdValueIsKey <int, int>();
            var thp    = source.WithThunderingHerdProtection();
            var c      = new ReadThroughCache <int, int>(thp, 10, null);

            Assert.AreEqual(1, c[1]);
        }
        public void invalidate_removes_item_from_gen0()
        {
            var cache = new ReadThroughCache <int, int>(new ValueIsKey <int, int>(), 10, null);

            Assert.AreEqual(1, cache[1]);
            Assert.AreEqual(1, cache.Count, "Count");
            cache.Remove(1);
            Assert.AreEqual(0, cache.Count, "Count");
        }
        public void eviction_raises_event_with_evicted_items()
        {
            var cache = new ReadThroughCache <int, int>(new ValueIsKey <int, int>(), 10, null);
            IReadOnlyDictionary <int, int> evicted = null;

            Assert.AreEqual(1, cache[1]);
            cache.Evicted += (sender, key) => evicted = key;
            cache.Clear();
            Assert.AreEqual(1, evicted.Count, "Evicted");
            Assert.AreEqual(0, cache.Count, "Cache");
        }
        public void drops_items_in_gen1_when_gen0_is_full()
        {
            var cache = new ReadThroughCache <int, int>(new ValueIsKey <int, int>(), 3, null);

            for (int i = 1; i <= 7; i++)
            {
                Assert.AreEqual(i, cache[i]);
            }
            Assert.AreEqual(3, cache._gen1.Count, "gen1.Count");
            Assert.AreEqual(1, cache._gen0.Count, "gen0.Count");
        }
Beispiel #5
0
        public async Task drops_items_in_gen1_when_gen0_is_full()
        {
            var cache = new ReadThroughCache <int, int>(new ValueIsKey <int, int>(), 3, null);

            for (int i = 1; i <= 7; i++)
            {
                Assert.AreEqual(i, await cache.GetAsync(i));
            }
            Assert.AreEqual(3, cache._gen1.Count, "gen1.Count");
            Assert.AreEqual(1, cache._gen0.Count, "gen0.Count");
        }
Beispiel #6
0
        public void generational_cache_memory_overhead(int items)
        {
            var sw = new Stopwatch();

            string[] keys     = CreateKeyStrings(items);
            var      starting = GC.GetTotalMemory(true);

            sw.Start();
            var cache = new ReadThroughCache <string, string>(valueIsKey, items / 2, null);

            foreach (var key in keys)
            {
                Assert.AreEqual(key, cache[key]);
            }
            sw.Stop();
            var allocated = GC.GetTotalMemory(false) - starting;
            var held      = GC.GetTotalMemory(true) - starting;

            Console.WriteLine($"Took {sw.ElapsedMilliseconds:N0} ms, {items} added to cache, {cache._gen0.Count + cache._gen1.Count} item in the cache, allocated {allocated:N0} bytes, holding {held:N0} bytes, overhead per item {held / (double)items:N2} bytes");
            GC.KeepAlive(cache);
            GC.KeepAlive(keys);
        }
Beispiel #7
0
 ReusableTask <int> ReadFromFilesAsync(ITorrentData torrent, BlockInfo block, Memory <byte> buffer)
 {
     ReadThroughCache?.Invoke(this, block);
     return(Writer.ReadFromFilesAsync(torrent, block, buffer));
 }
        public void can_read_item_from_underlying_cache(int key)
        {
            var cache = new ReadThroughCache <int, int>(new ValueIsKey <int, int>(), 3, null);

            Assert.AreEqual(key, cache[key]);
        }
Beispiel #9
0
        public async Task can_read_item_from_underlying_cache(int key)
        {
            var cache = new ReadThroughCache <int, int>(new ValueIsKey <int, int>(), 3, null);

            Assert.AreEqual(key, await cache.GetAsync(key));
        }