C#中字段与属性性能比较
【摘要】【目的】比较字段与属性读取的性能【结论】使用字段比属性赋值,快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倍,它不可能成为影响性能的主要瓶颈。应该可以放心使用。