使用对象 TValue 在字典中避免 boxing/unboxing
Avoiding boxing/unboxing in Dictionary with object TValue
有时我们需要在具有各种值类型的字典中存储键值对的集合。假设我们要存储一个由 boolean、int、string 值组成的表单。其中一些值类似于 ValueType,当我们将它们转换为 ReferenceType(例如 object
时,它会导致装箱。
根据这些参考:
装箱和拆箱会影响我们的性能,例如 GC 压力。问题是有什么办法可以避免字典中的 boxing/unboxing 它的 TValue
是 object
.
Dictionary<string, object>
如何避免这种情况下的装箱和拆箱?
您可以避免存储 相同值的多个装箱实例,方法是对经常使用的预装箱值实施缓存。例如,如果数字 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>
is probably not a very good idea。上面的代码示例只是为了演示这个概念。
有时我们需要在具有各种值类型的字典中存储键值对的集合。假设我们要存储一个由 boolean、int、string 值组成的表单。其中一些值类似于 ValueType,当我们将它们转换为 ReferenceType(例如 object
时,它会导致装箱。
根据这些参考:
装箱和拆箱会影响我们的性能,例如 GC 压力。问题是有什么办法可以避免字典中的 boxing/unboxing 它的 TValue
是 object
.
Dictionary<string, object>
如何避免这种情况下的装箱和拆箱?
您可以避免存储 相同值的多个装箱实例,方法是对经常使用的预装箱值实施缓存。例如,如果数字 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>
is probably not a very good idea。上面的代码示例只是为了演示这个概念。