From bf0380dbebee26bdac641b74681c052e4ec6f780 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Wed, 30 Mar 2022 01:24:27 -0700 Subject: [PATCH 1/3] Adds benchmarks for GetChildKeys --- .../GetChildKeysTests.cs | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs diff --git a/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs b/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs new file mode 100644 index 00000000000..879edd69a42 --- /dev/null +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs @@ -0,0 +1,111 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration.Memory; +using BenchmarkDotNet.Attributes; + +namespace Benchmark +{ + [BenchmarkCategory(Categories.Libraries)] + public class GetChildKeysTests + { + private ChainedConfigurationProvider _chainedConfig; + private ChainedConfigurationProvider _chainedConfigEmpty; + private ChainedConfigurationProvider _chainedConfigWithSplitting; + private ChainedConfigurationProvider _chainedConfigWithCommonPaths; + + [GlobalSetup(Targets = new[] { + nameof(AddChainedConfigurationNoDelimiter), + nameof(AddChainedConfigurationEmpty), + nameof(AddChainedConfigurationWithSplitting), + nameof(AddChainedConfigurationWithCommonPaths) + })] + public void SetupBasic() + { + var emptyKeys = new Dictionary() { }; + for (int i = 0; i < 1000; i++) + { + emptyKeys.Add(new string(' ', i), string.Empty); + } + + var inputKeys = new Dictionary() { }; + for (int i = 1000; i < 2000; i++) + { + inputKeys.Add(i.ToString(), string.Empty); + } + + var splittingKeys = new Dictionary() { }; + for (int i = 1000; i < 2000; i++) + { + splittingKeys.Add("a:" + i.ToString(), string.Empty); + } + + var keysWithCommonPaths = new Dictionary() { }; + for (int i = 1000; i < 2000; i++) + { + keysWithCommonPaths.Add("a:b:c" + i.ToString(), string.Empty); + } + + _chainedConfigEmpty = new ChainedConfigurationProvider(new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .Add(new MemoryConfigurationSource { InitialData = emptyKeys }) + .Build(), + ShouldDisposeConfiguration = false, + }); + + _chainedConfig = new ChainedConfigurationProvider(new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .Add(new MemoryConfigurationSource { InitialData = inputKeys }) + .Build(), + ShouldDisposeConfiguration = false, + }); + + _chainedConfigWithSplitting = new ChainedConfigurationProvider(new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .Add(new MemoryConfigurationSource { InitialData = splittingKeys }) + .Build(), + ShouldDisposeConfiguration = false, + }); + + _chainedConfigWithCommonPaths = new ChainedConfigurationProvider(new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .Add(new MemoryConfigurationSource { InitialData = keysWithCommonPaths }) + .Build(), + ShouldDisposeConfiguration = false, + }); + } + + [GlobalCleanup(Targets = new[] { + nameof(AddChainedConfigurationNoDelimiter), + nameof(AddChainedConfigurationEmpty), + nameof(AddChainedConfigurationWithSplitting), + nameof(AddChainedConfigurationWithCommonPaths) + })] + public void CleanupBasic() + { + _chainedConfig.Dispose(); + _chainedConfigEmpty.Dispose(); + _chainedConfigWithSplitting.Dispose(); + _chainedConfigWithCommonPaths.Dispose(); + } + + [Benchmark] + public void AddChainedConfigurationNoDelimiter() => _chainedConfig.GetChildKeys(new string[0], null); + + [Benchmark] + public void AddChainedConfigurationEmpty() => _chainedConfigEmpty.GetChildKeys(new string[0], null); + + [Benchmark] + public void AddChainedConfigurationWithSplitting() => _chainedConfigWithSplitting.GetChildKeys(new string[0], null); + + [Benchmark] + public void AddChainedConfigurationWithCommonPaths() => _chainedConfigWithCommonPaths.GetChildKeys(new string[0], null); + } +} From 6594e987295daf6b293cc044eb7f1c328a6cf631 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Wed, 30 Mar 2022 12:27:44 -0400 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Adam Sitnik --- .../GetChildKeysTests.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs b/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs index 879edd69a42..5ea9eb8d847 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Memory; using BenchmarkDotNet.Attributes; +using MicroBenchmarks; namespace Benchmark { @@ -17,12 +18,7 @@ public class GetChildKeysTests private ChainedConfigurationProvider _chainedConfigWithSplitting; private ChainedConfigurationProvider _chainedConfigWithCommonPaths; - [GlobalSetup(Targets = new[] { - nameof(AddChainedConfigurationNoDelimiter), - nameof(AddChainedConfigurationEmpty), - nameof(AddChainedConfigurationWithSplitting), - nameof(AddChainedConfigurationWithCommonPaths) - })] + [GlobalSetup] public void SetupBasic() { var emptyKeys = new Dictionary() { }; @@ -97,15 +93,15 @@ public void CleanupBasic() } [Benchmark] - public void AddChainedConfigurationNoDelimiter() => _chainedConfig.GetChildKeys(new string[0], null); + public void AddChainedConfigurationNoDelimiter() => _chainedConfig.GetChildKeys(Array.Empty(), null); [Benchmark] - public void AddChainedConfigurationEmpty() => _chainedConfigEmpty.GetChildKeys(new string[0], null); + public void AddChainedConfigurationEmpty() => _chainedConfigEmpty.GetChildKeys(Array.Empty(), null); [Benchmark] - public void AddChainedConfigurationWithSplitting() => _chainedConfigWithSplitting.GetChildKeys(new string[0], null); + public void AddChainedConfigurationWithSplitting() => _chainedConfigWithSplitting.GetChildKeys(Array.Empty(), null); [Benchmark] - public void AddChainedConfigurationWithCommonPaths() => _chainedConfigWithCommonPaths.GetChildKeys(new string[0], null); + public void AddChainedConfigurationWithCommonPaths() => _chainedConfigWithCommonPaths.GetChildKeys(Array.Empty(), null); } } From 04ffdc403b5acb0900249a1a46c910c90699408c Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Wed, 30 Mar 2022 16:33:50 -0700 Subject: [PATCH 3/3] Fix compile after auto-resolve --- .../GetChildKeysTests.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs b/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs index 5ea9eb8d847..e2e214bf838 100644 --- a/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs +++ b/src/benchmarks/micro/libraries/Microsoft.Extensions.Configuration/GetChildKeysTests.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Configuration.Memory; using BenchmarkDotNet.Attributes; using MicroBenchmarks; +using System; namespace Benchmark { @@ -17,6 +18,7 @@ public class GetChildKeysTests private ChainedConfigurationProvider _chainedConfigEmpty; private ChainedConfigurationProvider _chainedConfigWithSplitting; private ChainedConfigurationProvider _chainedConfigWithCommonPaths; + private readonly string[] _emptyArray = Array.Empty(); [GlobalSetup] public void SetupBasic() @@ -93,15 +95,15 @@ public void CleanupBasic() } [Benchmark] - public void AddChainedConfigurationNoDelimiter() => _chainedConfig.GetChildKeys(Array.Empty(), null); + public void AddChainedConfigurationNoDelimiter() => _chainedConfig.GetChildKeys(_emptyArray, null); [Benchmark] - public void AddChainedConfigurationEmpty() => _chainedConfigEmpty.GetChildKeys(Array.Empty(), null); + public void AddChainedConfigurationEmpty() => _chainedConfigEmpty.GetChildKeys(_emptyArray, null); [Benchmark] - public void AddChainedConfigurationWithSplitting() => _chainedConfigWithSplitting.GetChildKeys(Array.Empty(), null); + public void AddChainedConfigurationWithSplitting() => _chainedConfigWithSplitting.GetChildKeys(_emptyArray, null); [Benchmark] - public void AddChainedConfigurationWithCommonPaths() => _chainedConfigWithCommonPaths.GetChildKeys(Array.Empty(), null); + public void AddChainedConfigurationWithCommonPaths() => _chainedConfigWithCommonPaths.GetChildKeys(_emptyArray, null); } }