代码之家  ›  专栏  ›  技术社区  ›  kitsune

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

  •  1
  • kitsune  · 技术社区  · 17 年前

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

    下面是一个简化的版本:

    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 回复  |  直到 17 年前
        1
  •  0
  •   jpierson    16 年前

    book on Business Objects 但是我通过强制属性的实现者维护一个类型化的后备字段来避免对象装箱问题。我知道这是一种权衡,但在我的例子中,我看重的是性能而不是声明新属性的简单性。为了在整个属性查找和管理过程中管理类型,我大量使用Lambda表达式和泛型,到目前为止还不错,我击败了依赖对象和CSLA的性能。

    要回答您的问题,是的,使用对象装箱会对性能造成影响,而且对于这些属性支持的值类型,您将在堆中为每个值保留一个额外的指针,这通常会使这些值的内存占用增加一倍。至于性能会受到多大的影响,则取决于对这些属性的读写频率以及其他因素。如果您想了解性能差异,那么最好制作一个小的测试应用程序,运行一个循环,将一些整数作为一个对象装箱并取消装箱,而不是将相同的值存储在常规字段中。我的猜测是,不做物体拳击和非拳击你可能会提高你的表现至少2倍,但不要相信我做测试。