最近在看 .NET 8 新功能,有一個東西有點興趣 就是 FrozenDictionary ,想說他跟傳統的 Dictionary 有啥不同
畢竟 .NET 8 是以輾壓級效能做為賣點 ,看了一下官方這段話的介紹
以效能為焦點的類型.NET 8 引進數種旨在改善應用程式效能的新類型。
新的 System.Collections.Frozen
命名空間包含集合類型和 FrozenDictionary、FrozenSet
。
這些類型不允許在集合建立之後對索引鍵和值進行任何變更。 該需求允許更快速的讀取作業(例如, TryGetValue() )。
這些類型特別適用于第一次使用時填入的集合,然後在長期服務期間持續保存
感覺使用上就是拿來可以放在記憶體中快速索引的好東西,直接用 BenchmarkDotNet 跑一下

設計三個實驗對象 傳統的 Dictionary , 新的 FrozenDictionary ,還有一個 就是 HashTable
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var summary = BenchmarkRunner.Run();
}
public class ForzenTest
{
public Dictionary SampleDictionary { get; set; }
public FrozenDictionary SampleDictionaryFrozen { get; set; }
public Hashtable SampleDictionaryHashtable { get; set; }
public ForzenTest()
{
SampleDictionary = new Dictionary();
SampleDictionaryHashtable = new Hashtable();
for (var i = 1; i <= 10000; i++)
{
var guidStr = Guid.NewGuid().ToString("N") + "_" + i;
SampleDictionary.Add(i.ToString(), guidStr);
SampleDictionaryHashtable.Add(i.ToString(), guidStr);
}
SampleDictionaryFrozen = SampleDictionary.ToFrozenDictionary();
Console.WriteLine(SampleDictionary.Count + "," + SampleDictionaryFrozen.Count + "," + SampleDictionaryHashtable.Count);
}
[BenchmarkDotNet.Attributes.Benchmark]
public void TestDictionary()
{
for (var i = 1; i <= 100_000; i++)
{
var tmp = "";
SampleDictionary.TryGetValue("1999", out _);
}
}
[BenchmarkDotNet.Attributes.Benchmark]
public void TestDictionaryFrozen()
{
for (var i = 1; i <= 100_000; i++)
{
SampleDictionaryFrozen.TryGetValue("1999", out _);
}
}
[BenchmarkDotNet.Attributes.Benchmark]
public void TestDictionaryHashTable()
{
for (var i = 1; i <= 100_000; i++)
{
_ = SampleDictionaryHashtable["1999"];
}
}
}
Result:

結論就已取出來看的確是有壓倒性的勝利,如果以後需要 暫存在記憶體中查找的資料,可以使用這方法