Предотвращение бокса / распаковки в Словаре с объектом TValue - PullRequest
1 голос
/ 12 октября 2019

Иногда нам нужно хранить набор пар ключ-значение в словаре с различными типами значений. Предположим, мы хотим сохранить форму, состоящую из логических, int, строковых значений. Некоторые из этих значений имеют вид ValueType , и когда мы приводим их к ReferenceType , например object, это вызывает бокс.

Согласно этим ссылкам:

Воздействие на бокс и распаковкунаша наша производительность, такая как давление ГХ. Вопрос в том, есть ли способ избежать коробок / распаковок в Словаре, который TValue равен object.

Dictionary<string, object>

Как избежать коробок и распаковок в этом сценарии?

1 Ответ

1 голос
/ 13 октября 2019

Вы можете избежать хранения нескольких штучных экземпляров с одинаковыми значениями, реализовав кэш предварительно упакованных значений, которые часто используются. Например, если число 0 и логическое значение false часто вставляются в качестве значений, вы можете реализовать словарь, оптимизированный для памяти, например:

public sealed class ObjectDictionary<TKey> : Dictionary<TKey, object>
{
    private readonly object _cached_0 = 0;
    private readonly object _cached_false = false;

    public new void Add(TKey key, object value)
    {
        if (value is int && (int)value == 0)
        {
            base.Add(key, _cached_0);
        }
        else if (value is bool && (bool)value == false)
        {
            base.Add(key, _cached_false);
        }
        else
        {
            base.Add(key, value);
        }
    }
}

Исходные нули в штучной упаковке и ложные значения, которые передаются вметод Add будет сразу же иметь право на сборку мусора, так как они не будут храниться в словаре. Если это все еще проблема для сборщика мусора, то источником проблемы является не словарь, а что-то еще.

Обратите внимание, что наследование от Dictionary<TKey, object>, вероятно, неочень хорошая идея . Пример кода выше только для демонстрации концепции.

...