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"); }
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"); }
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); }
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]); }
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)); }