关于WPF的属性系统园子内有不少这方面的文章。里面大都提到了WPF依赖属性的在内存方面的优化。但是里面大都一笔带过。那么WPF到底是怎么样节约内存的。我们通过WPF属性和普通的CLR属性对比来看一下WPF属性在节约内存方面的优势在哪里。

     普通的CLR属性

public partial class WindowMemory : Window
{
   Student0 stu;
   public WindowMemory()
  {
    InitializeComponent();
    List<Student0> list = new List<Student0>();
    for (int i = 0; i < 10000000; i++)
    {
    stu = new Student0();
    list.Add(stu);
    }
  }
}
 public class Student0
    {
        public double Name { get; set; }
        public double Name1 { get; set; }
        public double Name2 { get; set; }
        public double Name3 { get; set; }
        public double Name4 { get; set; }
        public double Name5 { get; set; }
        public double Name6 { get; set; }
        public double Name7 { get; set; }
        public double Name8 { get; set; }
        public double Name9 { get; set; }
        public double Name10 { get; set; }
    }

我们声明一个Student0类,里面放入十个属性。然后new 一千万个student 的实例加载到内存中。在任务管理器中看一下内存占用。

WPF 属性系统 依赖属性之内存占用分析

我们看到程序大概占用了一个G的内存。计算一下。因为c#中的属性是通过get set方法对一个私有字段的封装,也就是说这个类里面有十个double类型的私有字段。double类型占8个字节。一兆是1048576个字节,131072个double类型。一千万个double大概占用76兆的内存。我们这儿声明了十个也就是760兆。另外还有student对象占用的内存。所以这儿程序占用内存大概是一个G;

依赖属性

 public class Student0 : DependencyObject
    {
        public double Name
        {
            get
            {
                return (double)GetValue(NameProperty);
            }
            set
            {
                SetValue(NameProperty, value);
            }
        }
        public double Name1
        {
            get
            {
                return (double)GetValue(Name1Property);
            }
            set
            {
                SetValue(Name1Property, value);
            }
        }
        public double Name2
        {
            get
            {
                return (double)GetValue(Name2Property);
            }
            set
            {
                SetValue(Name2Property, value);
            }
        }
        public double Name3
        {
            get
            {
                return (double)GetValue(Name3Property);
            }
            set
            {
                SetValue(Name3Property, value);
            }
        }

        public double Name4
        {
            get
            {
                return (double)GetValue(Name4Property);
            }
            set
            {
                SetValue(Name4Property, value);
            }
        }
        public double Name5
        {
            get
            {
                return (double)GetValue(Name5Property);
            }
            set
            {
                SetValue(Name5Property, value);
            }
        }
        public double Name6
        {
            get
            {
                return (double)GetValue(Name6Property);
            }
            set
            {
                SetValue(Name6Property, value);
            }
        }

        public double Name7
        {
            get
            {
                return (double)GetValue(Name7Property);
            }
            set
            {
                SetValue(Name7Property, value);
            }
        }
        public double Name8
        {
            get
            {
                return (double)GetValue(Name8Property);
            }
            set
            {
                SetValue(Name8Property, value);
            }
        }
        public double Name9
        {
            get
            {
                return (double)GetValue(Name9Property);
            }
            set
            {
                SetValue(Name9Property, value);
            }
        }
        public double Name10
        {
            get
            {
                return (double)GetValue(Name10Property);
            }
            set
            {
                SetValue(Name10Property, value);
            }
        }public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name1Property = DependencyProperty.Register("Name1", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name2Property = DependencyProperty.Register("Name2", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name3Property = DependencyProperty.Register("Name3", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name4Property = DependencyProperty.Register("Name4", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name5Property = DependencyProperty.Register("Name5", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name6Property = DependencyProperty.Register("Name6", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name7Property = DependencyProperty.Register("Name7", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name8Property = DependencyProperty.Register("Name8", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name9Property = DependencyProperty.Register("Name9", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
        public static readonly DependencyProperty Name10Property = DependencyProperty.Register("Name10", typeof(double), typeof(Student0), new PropertyMetadata((double)55.55));
    }
View Code

相关文章:

  • 2021-12-17
猜你喜欢
  • 2021-10-06
  • 2021-11-16
  • 2021-10-18
  • 2021-06-03
  • 2021-08-29
相关资源
相似解决方案