存储泛型值时,C#中的类型转换和装箱/拆箱类型的性能损失

时间:2009-08-14 07:10:50

标签: wpf generics casting performance

我有一个类似于WPF的DependencyProperty和DependencyObject系统的设置。然而,我的属性是通用的。 BucketProperty具有静态GlobalIndex(在BucketPropertyBase中定义),它跟踪所有BucketProperties。 Bucket可以有许多任何类型的BucketProperties。一个Bucket保存并获取这些BucketProperties的实际值...现在我的问题是,如何处理这些值的存储,以及在检索它们时使用类型转换的惩罚是什么?我目前使用BucketEntries数组将属性值保存为简单对象。有没有更好的方法来保存和返回这些值?

Beneath是一个简化的版本:

public class BucketProperty<T> : BucketPropertyBase
{

}

public class Bucket
{
    private BucketEntry[] _bucketEntries;

    public void SaveValue<T>(BucketProperty<T> property, T value)
    {
        SaveBucketEntry(property.GlobalIndex, value)
    }
    public T GetValue<T>(BucketProperty<T> property)
    {
        return (T)FindBucketEntry(property.GlobalIndex).Value;
    } 
}

public class BucketEntry
{
    private object _value;
    private uint _index;
        public BucketEntry(uint globalIndex, object value)
        {
            ...
        }
}

1 个答案:

答案 0 :(得分:0)

我在阅读Rockford Lhotka的book on Business Objects之后创建了一个非常相似的设置,但我通过强制属性的实现者来维护一个类型化的支持字段来避免对象限制问题。我知道这是一个权衡,但在我的情况下,我重视的是表现出宣传新属性的简单性。为了在整个属性查找和管理中管理类型,我非常重视Lambda表达式和泛型,到目前为止,我正在击败依赖对象和CSLA的性能。

要回答你的问题,是的,你将通过使用对象装箱以及由这些属性支持的值类型获得性能损失,你将存储在堆中为每个值保留一个额外的指针,这通常会使内存占用量增加一倍对于这些价值观。至于您将采取多少性能,取决于在这些属性中如何定期读取和写入以及其他因素。如果你想要了解性能差异,那么制作一个运行循环的小型测试应用程序并将一些整数作为一个对象进行包装并取消装箱而不是在常规字段中存储相同的值可能是一个好主意。我的猜测是,如果不做对象拳击和解拳,你可能会提高你的表现至少2倍,但不要接受我的话做测试。