, как Immutabledictionar TVALUE> тоже не просто оберните. Он имеет настраиваемую реализацию, ориентированную на то, чтобы сделать операции чтения максимально быстрым, как для поиска, так и для перечисления . это: < /p>
Код: Выделить всё
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Collections.Frozen;
[MemoryDiagnoser]
public class DictionaryVsFrozenDictionaryBenchmarks
{
private KeyValuePair[] _source;
private Dictionary _dictionary;
private FrozenDictionary _frozen;
private string _middleKey;
private string _middleKeyPlusOne;
[Params(10, 100, 10_000)]
public int Size;
[GlobalSetup]
public void Setup()
{
_source = Enumerable.Range(0, Size)
.Select(i => new KeyValuePair($"Key{i}", $"Value{i}"))
.ToArray();
_middleKey = $"Key{Size / 2}";
_middleKeyPlusOne = $"Key{Size / 2 + 1}";
_dictionary = new Dictionary(_source);
_frozen = _dictionary.ToFrozenDictionary();
}
[Benchmark]
public Dictionary Dictionary_Create() => new Dictionary(_source);
[Benchmark]
public FrozenDictionary FrozenDictionary_Create()
{
return new Dictionary(_source).ToFrozenDictionary();
}
[Benchmark]
public string Dictionary_Read1() => _dictionary[_middleKey];
[Benchmark]
public string FrozenDictionary_Read1() => _frozen[_middleKey];
[Benchmark]
public string Dictionary_Read2() => _dictionary[_middleKeyPlusOne];
[Benchmark]
public string FrozenDictionary_Read2() => _frozen[_middleKeyPlusOne];
[Benchmark]
public int Dictionary_Iteration()
{
int count = 0;
foreach (var kvp in _dictionary)
{
count += kvp.Value.Length;
}
return count;
}
[Benchmark]
public int FrozenDictionary_Iteration()
{
int count = 0;
foreach (var kvp in _frozen)
{
count += kvp.Value.Length;
}
return count;
}
}
public class Program
{
public static void Main(string[] args)
{
BenchmarkRunner.Run();
}
}
Я делаю что -то не так? Может, это специфичный для процессора? Мой довольно старый (я купил его в прошлом году), так что, возможно, больше не работает, как ожидалось. < /P>
Код: Выделить всё
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.4351)
AMD Ryzen 9 7900, 1 CPU, 24 logical and 12 physical cores
.NET SDK 9.0.301
[Host] : .NET 9.0.6 (9.0.625.26613), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
DefaultJob : .NET 9.0.6 (9.0.625.26613), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
| Method | Size | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|--------------------------- |------ |---------------:|---------------:|---------------:|---------:|---------:|---------:|----------:|
| Dictionary_Create | 10 | 83.758 ns | 0.3282 ns | 0.2909 ns | 0.0262 | - | - | 440 B |
| FrozenDictionary_Create | 10 | 507.064 ns | 7.0749 ns | 5.9079 ns | 0.1144 | - | - | 1920 B |
| Dictionary_Read1 | 10 | 6.816 ns | 0.0298 ns | 0.0279 ns | - | - | - | - |
| FrozenDictionary_Read1 | 10 | 3.936 ns | 0.0256 ns | 0.0239 ns | - | - | - | - |
| Dictionary_Read2 | 10 | 6.896 ns | 0.0410 ns | 0.0363 ns | - | - | - | - |
| FrozenDictionary_Read2 | 10 | 3.923 ns | 0.0256 ns | 0.0239 ns | - | - | - | - |
| Dictionary_Iteration | 10 | 5.698 ns | 0.0231 ns | 0.0216 ns | - | - | - | - |
| FrozenDictionary_Iteration | 10 | 9.033 ns | 0.0107 ns | 0.0095 ns | - | - | - | - |
| Dictionary_Create | 100 | 744.981 ns | 4.7618 ns | 4.4542 ns | 0.1869 | 0.0010 | - | 3128 B |
| FrozenDictionary_Create | 100 | 5,195.994 ns | 61.6515 ns | 57.6689 ns | 0.9079 | 0.0381 | - | 15288 B |
| Dictionary_Read1 | 100 | 6.379 ns | 0.0219 ns | 0.0183 ns | - | - | - | - |
| FrozenDictionary_Read1 | 100 | 4.988 ns | 0.1318 ns | 0.1518 ns | - | - | - | - |
| Dictionary_Read2 | 100 | 6.345 ns | 0.1527 ns | 0.1192 ns | - | - | - | - |
| FrozenDictionary_Read2 | 100 | 5.257 ns | 0.1066 ns | 0.0891 ns | - | - | - | - |
| Dictionary_Iteration | 100 | 58.236 ns | 0.6178 ns | 0.4824 ns | - | - | - | - |
| FrozenDictionary_Iteration | 100 | 82.735 ns | 1.6026 ns | 1.9077 ns | - | - | - | - |
| Dictionary_Create | 10000 | 191,494.816 ns | 3,777.4265 ns | 5,768.5296 ns | 76.9043 | 76.9043 | 76.9043 | 283068 B |
| FrozenDictionary_Create | 10000 | 634,803.685 ns | 12,458.2875 ns | 15,755.7460 ns | 227.5391 | 210.9375 | 199.2188 | 1210740 B |
| Dictionary_Read1 | 10000 | 7.748 ns | 0.0930 ns | 0.0776 ns | - | - | - | - |
| FrozenDictionary_Read1 | 10000 | 5.568 ns | 0.1256 ns | 0.1049 ns | - | - | - | - |
| Dictionary_Read2 | 10000 | 9.025 ns | 0.1822 ns | 0.2025 ns | - | - | - | - |
| FrozenDictionary_Read2 | 10000 | 5.595 ns | 0.1142 ns | 0.1068 ns | - | - | - | - |
| Dictionary_Iteration | 10000 | 8,095.952 ns | 158.1932 ns | 147.9740 ns | - | - | - | - |
| FrozenDictionary_Iteration | 10000 | 8,374.613 ns | 164.6504 ns | 236.1367 ns | - | - | - | - |
Подробнее здесь: https://stackoverflow.com/questions/796 ... -net-9-0-6
Мобильная версия