Почему мой Frozendictionary медленно переходит? .NET 9.0.6C#

Место общения программистов C#
Ответить
Anonymous
 Почему мой Frozendictionary медленно переходит? .NET 9.0.6

Сообщение Anonymous »

Если мы посмотрим на https://devblogs.microsoft.com/dotnet/p ... ollections, написано:

, как 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();
}
}
И хотя я вижу, что операции чтения быстрее в Frozendictionary , как и ожидалось, кажется, что итерация значительно медленнее (+на 50% медленнее фактически на небольших словарях).
Я делаю что -то не так? Может, это специфичный для процессора? Мой довольно старый (я купил его в прошлом году), так что, возможно, больше не работает, как ожидалось. < /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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»