|
using BenchmarkDotNet.Attributes; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
|
|
namespace Benchmark_ToListCall |
|
{ |
|
[MemoryDiagnoser] |
|
public class DictionaryBenchmarks |
|
{ |
|
Dictionary<string, IReadOnlyDictionary<string, uint>> featureExtractors = null; |
|
|
|
[GlobalSetup] |
|
public void Init() |
|
{ |
|
IReadOnlyDictionary<string, uint> featureValuesDict1 = new Dictionary<string, uint>(StringComparer.InvariantCultureIgnoreCase) |
|
{ |
|
{ "aaaa", 101 }, |
|
{ "foo-50", 202 }, |
|
{ "cccc", 301 }, |
|
{ "foo-60", 202 } |
|
}; |
|
|
|
var featureValuesDict2 = new Dictionary<string, uint>(StringComparer.InvariantCultureIgnoreCase); |
|
|
|
for (var i = 0; i < 350; i++) |
|
{ |
|
string str = i.ToString(); |
|
featureValuesDict2.Add($"foo-{str}", (uint)i); |
|
} |
|
|
|
IReadOnlyDictionary<string, uint> featureValuesDict3 = new Dictionary<string, uint>(StringComparer.InvariantCultureIgnoreCase) |
|
{ |
|
{ "foo-70", 202 }, |
|
{ "xx", 9999 } |
|
}; |
|
|
|
this.featureExtractors = new Dictionary<string, IReadOnlyDictionary<string, uint>> |
|
{ |
|
{ "featureExtractor1", featureValuesDict1 }, |
|
{ "featureExtractor2", featureValuesDict2 }, |
|
{ "featureExtractor3", featureValuesDict3 } |
|
}; |
|
} |
|
|
|
[Benchmark] |
|
public Dictionary<string, uint> GetDeDupedEntriesUsingGroupByFirst() |
|
{ |
|
var featureMap = new Dictionary<string, uint>(StringComparer.InvariantCultureIgnoreCase); |
|
|
|
foreach (var featureExtractor in this.featureExtractors) |
|
{ |
|
var features = featureExtractor.Value; |
|
|
|
if (features == null || !features.Any()) |
|
{ |
|
continue; |
|
} |
|
|
|
featureMap = featureMap.Union(features) |
|
.GroupBy(g => g.Key) |
|
.ToDictionary(pair => pair.Key, pair => pair.First().Value, StringComparer.InvariantCultureIgnoreCase); |
|
} |
|
|
|
return featureMap; |
|
} |
|
|
|
[Benchmark] |
|
public Dictionary<string, uint> GetDeDupedEntriesNonLINQ() |
|
{ |
|
|
|
var featureMap = new Dictionary<string, uint>(StringComparer.InvariantCultureIgnoreCase); |
|
|
|
foreach (var featureExtractor in this.featureExtractors) |
|
{ |
|
var features = featureExtractor.Value; |
|
|
|
if (features == null || !features.Any()) |
|
{ |
|
continue; |
|
} |
|
|
|
foreach (var kp in features) |
|
{ |
|
featureMap.TryAdd(kp.Key, kp.Value); |
|
} |
|
} |
|
|
|
return featureMap; |
|
} |
|
} |
|
} |