Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kshyju/10f74c46ce960c091559a090595180b9 to your computer and use it in GitHub Desktop.
Save kshyju/10f74c46ce960c091559a090595180b9 to your computer and use it in GitHub Desktop.
DeDupeDictionaryEntries-LINQGroupByFirstvsNONLINQ benchamarks
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;
}
}
}
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
Intel Xeon CPU E5-1650 v4 3.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.100-rc.2.20479.15
  [Host]     : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
  DefaultJob : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT

Method Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
GetDeDupedEntriesUsingGroupByFirst 409.42 μs 8.122 μs 14.646 μs 26.8555 4.8828 - 206.99 KB
GetDeDupedEntriesNonLINQ 93.65 μs 1.864 μs 4.357 μs 2.8076 0.2441 - 22.11 KB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment