【发布时间】:2011-03-16 22:37:36
【问题描述】:
我在某处读到,拥有公共属性比在类中拥有公共成员更可取。
这仅仅是因为抽象和模块化吗?还有其他压倒一切的原因吗?
编译器会将属性访问合并到函数调用中。对于没有备份存储的属性(例如
public string UserName { get; set; }),与直接成员访问相比,性能开销是多少? (我知道这通常不会产生影响,但在我的某些代码中,属性被访问了数百万次。)
编辑1: 我在整数成员和属性上运行了一些测试代码,公共成员的速度大约是属性的 3-4 倍。 (调试中的约 57 毫秒与约 206 毫秒以及发布中的 57 与 97 是最常见的运行值)。对于 1000 万次读取和写入,两者都小到不足以证明更改任何内容是合理的。
代码:
class TestTime1
{
public TestTime1() { }
public int id=0;
}
class TestTime2
{
public TestTime2() { }
[DefaultValue(0)]
public int ID { get; set; }
}
class Program
{
static void Main(string[] args)
{
try
{
TestTime1 time1 = new TestTime1();
TestTime2 time2 = new TestTime2();
Stopwatch watch1 = new Stopwatch();
Stopwatch watch2 = new Stopwatch();
watch2.Start();
for (int i = 0; i < 10000000; i++)
{
time2.ID = i;
i = time2.ID;
}
watch2.Stop();
watch1.Start();
for (int i = 0; i < 10000000; i++)
{
time1.id = i;
i = time1.id;
}
watch1.Stop();
Console.WriteLine("Time for 1 and 2 : {0},{1}",watch1.ElapsedMilliseconds,watch2.ElapsedMilliseconds);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.In.ReadLine();
}
}
【问题讨论】:
-
序列化和DataBinding是我能想到的原因
-
未优化调试版本的因素差异无关紧要。您没有将调试版本发送给客户。另外,我注意到在您的测试中,您正在测量 属性的 jit 时间 以及 访问时间。如果您对 jitting 属性的 amortized 成本(包括它的启动时间)感兴趣,那是一回事。但是,如果您感兴趣的是 每次使用 成本,那么 不要将 jit 成本与每次使用成本混为一谈,就像您在此处所做的那样。不管你的测量技术是否好:优化最慢的东西。我怀疑是这个。
标签: c# .net performance