.NET 8 — FrozenDictionary and FrozenSet Benchmark
With the arrival of .NET 8, two new collections will be introduced: FrozenDictionary and FrozenSet. These collections have been designed to enhance efficiency in read operations, as stated by Microsoft:
Microsoft: https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8
.NET 8 introduces several new types aimed at improving app performance.
The new System.Collections.Frozen namespace includes the collection types FrozenDictionary<TKey,TValue> and FrozenSet<T>. These types don’t allow any changes to keys and values once a collection created. That requirement allows faster read operations…
You can convert an IEnumerable into a FrozenDictionary using the .ToFrozenDictionary() method or transform it into a FrozenSet using the .ToFrozenSet() method.
Benchmark
To confirm the performance improvement, some benchmarks will be conducted.
Device Setup
Here, the device settings that conducted the tests will be displayed.
FrozenDictionary
Test Scenario
private const int OneMilion = 1_000_000;
private readonly Dictionary<int, int> _dictionary = Enumerable.Range(0, OneMilion).ToDictionary(x => x);
private readonly FrozenDictionary<int, int> _frozenDictionary = Enumerable.Range(0, OneMilion).ToFrozenDictionary(x => x);
private readonly ImmutableDictionary<int, int> _immutableDictionary = Enumerable.Range(0, OneMilion).ToImmutableDictionary(x => x);
The TryGetValue method will be used to assess the performance of each of the collections.
Test Result
Smaller values are better:
— Mean: Arithmetic mean of all measurements
— Error: Half of 99.9% confidence interval
— StdDev: Standard deviation of all measurements
— Rank: Relative position of current benchmark mean among all benchmarks
The FrozenDictionary secured the first place with an impressive approximately 50% improvement in processing speed compared to the second-place Dictionary. This signifies a significant enhancement in efficiency and performance for the operation in question.
FrozenSet
Test Scenario
private const int OneMilion = 1_000_000;
private readonly HashSet<int> _hashSet = Enumerable.Range(0, OneMilion).ToHashSet();
private readonly FrozenSet<int> _frozenSet = Enumerable.Range(0, OneMilion).ToFrozenSet();
private readonly ImmutableHashSet<int> _immutableHashSet = Enumerable.Range(0, OneMilion).ToImmutableHashSet();
The TryGetValue method will be used to assess the performance of each of the collections.
Test Result
Smaller values are better:
— Mean: Arithmetic mean of all measurements
— Error: Half of 99.9% confidence interval
— StdDev: Standard deviation of all measurements
— Rank: Relative position of current benchmark mean among all benchmarks
The FrozenSet claimed the top position with an approximately 17% increase in processing speed when compared to the second-place HashSet. This underscores a substantial improvement in both efficiency and overall performance for the specific operation being assessed.
Conclusion
The test results have been positive, demonstrating a significant improvement in performance for the new collections, but please note that test results may vary depending on the specific machine and the test scenario used.