C#中字段与属性性能比较

来源:岁月联盟 编辑:zhu 时间:2009-01-15

    【摘要】【目的】比较字段与属性读取的性能【结论】使用字段比属性赋值,快50-60倍左右,读取,快3倍左右。但是它不可能成为影响性能的主要瓶颈

     Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。

     把所有的字段都设为私有字段,如果要暴露它们,则把它们封装成属性。这也是微软推荐的方式。具体的好处此处不赘述。
     属性的实质是方法(get和set方法),IL中没有属性的概念。因此,使用属性必然会带来性能的降低。到底使用属性和使用字段的性能差多少。我自己写了一个小程序进行测试。主要代码如下:

    public class TestFeildProperty
    {
        static readonly int _RunTime = 10000000;
        public static void UseField()
        {
            DateTime begin = DateTime.Now;
            int milliSecondBegin = DateTime.Now.Millisecond;
            for (int i = 0; i < _RunTime; i++)
            {
                _TestField = 1;
            }
            DateTime end = DateTime.Now;
            TimeSpan result = end - begin;
            Console.WriteLine(result.ToString());
        }
        public static void UseProperty()
        {
            DateTime begin = DateTime.Now;
            int milliSecondBegin = DateTime.Now.Millisecond;
            for (int i = 0; i < _RunTime; i++)
            {
                TestField = 1;
            }
            DateTime end = DateTime.Now;
            TimeSpan result = end - begin;
            Console.WriteLine(result.ToString());
        }

        static int _TestField;
        static int TestField
        {
            set  { _TestField = value; }

            get  { return _TestField;   }

        }

   }

      测试方式为对字段和属性循环赋值和读取(以上代码只有赋值部分)。

测试结果

    class Program
    {
        static void Main(string[] args)
        {
            TestFeildProperty.UseField();
            TestFeildProperty.UseProperty();

        }

    }

表1 循环赋值     一千万次 一亿次 字段 0.03125秒

0.3125秒

属性 1.702315秒 17.140625秒 表2 循环读取     一千万次 一亿次 字段 0.03125秒

0.2825秒

属性 0.09375秒 0.984375秒

 结论:使用属性和字段之间的性能差距大概是:赋值,50-60倍左右,读取,3倍左右。

补充:这个测试结果只是针对int型的,也许对字符串或者其他类型的会有不同结果。
但是可以看出来,对属性赋值一次的时间是一千万分之一秒,所以即使它比字段赋值慢50倍,它不可能成为影响性能的主要瓶颈。应该可以放心使用。