From e888e2646b714dfd26b197dfd9fb11af6faf20c9 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Fri, 11 Dec 2020 14:29:59 +0100 Subject: [PATCH] add CreateEntry and AddThenRemove_ExpirationTokens benchmarks --- .../MemoryCacheTests.cs | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs b/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs index 9012fa3dd71..298b96d6e79 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs @@ -5,6 +5,7 @@ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Extensions; using MicroBenchmarks; +using Microsoft.Extensions.Primitives; using System; using System.Linq; @@ -16,7 +17,7 @@ public class MemoryCacheTests private MemoryCache _memCache; private (object key, object value)[] _items; - [GlobalSetup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride) })] + [GlobalSetup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride), nameof(CreateEntry) })] public void SetupBasic() { _memCache = new MemoryCache(new MemoryCacheOptions()); @@ -26,7 +27,7 @@ public void SetupBasic() } } - [GlobalCleanup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride) })] + [GlobalCleanup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride), nameof(CreateEntry) })] public void CleanupBasic() => _memCache.Dispose(); [Benchmark] @@ -44,7 +45,10 @@ public void SetupBasic() [Benchmark] public object SetOverride() => _memCache.Set("512", "512"); - [GlobalSetup(Targets = new[] { nameof(AddThenRemove_NoExpiration), nameof(AddThenRemove_AbsoluteExpiration), nameof(AddThenRemove_RelativeExpiration), nameof(AddThenRemove_SlidingExpiration) })] + [Benchmark] + public void CreateEntry() => _memCache.CreateEntry(this).Dispose(); + + [GlobalSetup(Targets = new[] { nameof(AddThenRemove_NoExpiration), nameof(AddThenRemove_AbsoluteExpiration), nameof(AddThenRemove_RelativeExpiration), nameof(AddThenRemove_SlidingExpiration), nameof(AddThenRemove_ExpirationTokens) })] public void Setup_AddThenRemove() { _items = ValuesGenerator.ArrayOfUniqueValues(100).Select(x => ((object)x.ToString(), (object)x.ToString())).ToArray(); @@ -138,5 +142,39 @@ public void AddThenRemove_SlidingExpiration() } } } + + [Benchmark] + public void AddThenRemove_ExpirationTokens() + { + Token token = new Token(); + + using (MemoryCache cache = new MemoryCache(new MemoryCacheOptions())) + { + foreach (var item in _items) + { + using (ICacheEntry entry = cache.CreateEntry(item.key)) + { + entry.ExpirationTokens.Add(token); + entry.Value = item.value; + } + } + + foreach (var item in _items) + { + cache.Remove(item.key); + } + } + } + + private sealed class Token : IChangeToken, IDisposable + { + public bool HasChanged => false; + + public bool ActiveChangeCallbacks => false; + + public void Dispose() { } + + public IDisposable RegisterChangeCallback(Action callback, object state) => this; + } } }