From 444d122e3878faa38ab566af44e020ca1c72eb4b Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Tue, 1 Dec 2020 18:00:30 +0100 Subject: [PATCH 1/4] add more MemoryCache benchmarks --- .../MemoryCacheTests.cs | 71 ++++++++++++++++++- 1 file changed, 68 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 403f4e1462c..dc18a9b4422 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs @@ -3,7 +3,10 @@ // See the LICENSE file in the project root for more information. using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Extensions; using MicroBenchmarks; +using System; +using System.Linq; namespace Microsoft.Extensions.Caching.Memory.Tests { @@ -11,9 +14,10 @@ namespace Microsoft.Extensions.Caching.Memory.Tests public class MemoryCacheTests { private MemoryCache _memCache; + private (object key, object value)[] _items; - [GlobalSetup] - public void Setup() + [GlobalSetup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride) })] + public void SetupBasic() { _memCache = new MemoryCache(new MemoryCacheOptions()); for (var i = 0; i < 1024; i++) @@ -22,7 +26,7 @@ public void Setup() } } - [GlobalCleanup] + [GlobalCleanup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride) })] public void Cleanup() => _memCache.Dispose(); [Benchmark] @@ -39,5 +43,66 @@ public void Setup() [Benchmark] public object SetOverride() => _memCache.Set("512", "512"); + + [GlobalSetup(Targets = new[] { nameof(AddThenRemove_NoExpiration), nameof(AddThenRemove_AbsoluteExpiration), nameof(AddThenRemove_RelativeExpiration) })] + public void Setup_AddThenRemove() + { + _items = ValuesGenerator.ArrayOfUniqueValues(100).Select(x => ((object)x.ToString(), (object)x.ToString())).ToArray(); + } + + [Benchmark] + public void AddThenRemove_NoExpiration() + { + using (MemoryCache cache = new MemoryCache(new MemoryCacheOptions())) + { + foreach (var item in _items) + { + cache.Set(item.key, item.value); + } + + foreach (var item in _items) + { + cache.Remove(item.key); + } + } + } + + [Benchmark] + public void AddThenRemove_AbsoluteExpiration() + { + DateTimeOffset absolute = DateTimeOffset.UtcNow.AddHours(1); + + using (MemoryCache cache = new MemoryCache(new MemoryCacheOptions())) + { + foreach (var item in _items) + { + cache.Set(item.key, item.value, absolute); + } + + foreach (var item in _items) + { + cache.Remove(item.key); + } + } + } + + [Benchmark] + public void AddThenRemove_RelativeExpiration() + { + TimeSpan relative = TimeSpan.FromHours(1); + + using (MemoryCache cache = new MemoryCache(new MemoryCacheOptions())) + { + foreach (var item in _items) + { + cache.Set(item.key, item.value, relative); + } + + foreach (var item in _items) + { + cache.Remove(item.key); + } + } + } } } From a7fad1ff4cf813f7684637bdd2f3e983207f7a5d Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 2 Dec 2020 09:50:36 +0100 Subject: [PATCH 2/4] Update src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs Co-authored-by: Eric Erhardt --- .../Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 dc18a9b4422..5485519ca10 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs @@ -27,7 +27,7 @@ public void SetupBasic() } [GlobalCleanup(Targets = new[] { nameof(GetHit), nameof(TryGetValueHit), nameof(GetMiss), nameof(TryGetValueMiss), nameof(SetOverride) })] - public void Cleanup() => _memCache.Dispose(); + public void CleanupBasic() => _memCache.Dispose(); [Benchmark] public object GetHit() => _memCache.Get("256"); From ee8aeeb5acecb971ac52a67e26b545060ae7b74e Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 2 Dec 2020 09:59:45 +0100 Subject: [PATCH 3/4] address code review feedback: add SlidingExpiration benchmark as well --- .../MemoryCacheTests.cs | 40 +++++++++++++++++-- 1 file changed, 37 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 5485519ca10..108476e3853 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs @@ -57,7 +57,10 @@ public void AddThenRemove_NoExpiration() { foreach (var item in _items) { - cache.Set(item.key, item.value); + using (ICacheEntry entry = cache.CreateEntry(item.key)) + { + entry.Value = item.value; + } // entry.Dispose is adding it to the cache } foreach (var item in _items) @@ -76,7 +79,11 @@ public void AddThenRemove_AbsoluteExpiration() { foreach (var item in _items) { - cache.Set(item.key, item.value, absolute); + using (ICacheEntry entry = cache.CreateEntry(item.key)) + { + entry.AbsoluteExpiration = absolute; + entry.Value = item.value; + } } foreach (var item in _items) @@ -95,7 +102,34 @@ public void AddThenRemove_RelativeExpiration() { foreach (var item in _items) { - cache.Set(item.key, item.value, relative); + using (ICacheEntry entry = cache.CreateEntry(item.key)) + { + entry.AbsoluteExpirationRelativeToNow = relative; + entry.Value = item.value; + } + } + + foreach (var item in _items) + { + cache.Remove(item.key); + } + } + } + + [Benchmark] + public void AddThenRemove_SlidingExpiration() + { + TimeSpan relative = TimeSpan.FromHours(1); + + using (MemoryCache cache = new MemoryCache(new MemoryCacheOptions())) + { + foreach (var item in _items) + { + using (ICacheEntry entry = cache.CreateEntry(item.key)) + { + entry.SlidingExpiration = relative; + entry.Value = item.value; + } } foreach (var item in _items) From c2fbd4c244d4207ca6c26333313749057a606143 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 2 Dec 2020 10:03:41 +0100 Subject: [PATCH 4/4] dont forget about the setup --- .../Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 108476e3853..9012fa3dd71 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Caching.Memory/MemoryCacheTests.cs @@ -44,7 +44,7 @@ public void SetupBasic() [Benchmark] public object SetOverride() => _memCache.Set("512", "512"); - [GlobalSetup(Targets = new[] { nameof(AddThenRemove_NoExpiration), nameof(AddThenRemove_AbsoluteExpiration), nameof(AddThenRemove_RelativeExpiration) })] + [GlobalSetup(Targets = new[] { nameof(AddThenRemove_NoExpiration), nameof(AddThenRemove_AbsoluteExpiration), nameof(AddThenRemove_RelativeExpiration), nameof(AddThenRemove_SlidingExpiration) })] public void Setup_AddThenRemove() { _items = ValuesGenerator.ArrayOfUniqueValues(100).Select(x => ((object)x.ToString(), (object)x.ToString())).ToArray();