我问这个问题的表现是主要关注点。但我想知道这两种方法的其他可能的优点/缺点。
问题是:由于属性转换为IL中的方法,如果调用属性而不是直接访问字段(从类中),是否会有显着的性能损失?
我正在设计一个转换类(PersonalizationConstructor),其目的是从IDataReader“构造域实体”。
我想在这个类的构造函数(PersonalizationConstructor)中接受IDataReader并保护虚拟属性以从IDataReader记录集返回数据;像:
protected virtual string ProductFilterCriteria
{
get;
set;
}
我可以在一个类中为此实现提供15个以上的属性。这样,在从记录集访问之前,可以覆盖属性以检查记录集是否具有“XXX”字段(我不希望将此检查作为所有的默认实现)。
在一个类中有15个以上的虚拟属性是否适合实现上述情况?
请不要过多关注IDataReader。我主要担心的是:
由于属性转换为IL中的方法,如果调用属性而不是直接(从类中)访问字段,是否会有明显的性能惩罚?
我会有这样的事情:
class MainSite
{
protected virtual string ProductFilterCriteria
{
get
{
return _source["ProductFilterCriteria"];
}
}
protected virtual string Abc
{
get
{
return _source["Abc"];
}
}
protected virtual string Def
{
get
{
return _source["Def"];
}
}
..... many properties
}
class VirtualSite : MainSite
{
protected override string ProductFilterCriteria
{
get
{
return null;
}
}
}
答案 0 :(得分:2)
与以往一样,在根据性能做出设计决策之前 - 测量它!
假设数据来自关系数据库,我强烈怀疑查询本身(以及相关的转换,网络IO等)将主导性能。
JIT无法内联虚拟属性调用,但如果使用虚拟属性的原因是不同的实现可能需要做不同的事情,那么你真的没有无论如何都可以使用直接现场访问。
我不想说你的设计是否合适 - 我们没有足够的信息 - 但如果你认为这是实现你所需要的最可读的方式,那么建立一个原型并测量其性能在偏离该设计之前。
答案 1 :(得分:1)
设置或检索使用C#3.0属性语法实现的属性,或者使用字段支持的旧式属性,可以(但不一定会)通过JIT优化。这意味着在这方面的任何优化都是无法衡量的,甚至可能适得其反。
您所说的是采用类类型的属性(而不是像int
float
这样的基本类型。这些类(ctor)的开销或花在做完全不同的事情上的时间(你提到IDataReader
,我假设读取数据,这是昂贵的)比你可能的1或2μ-ops大得多通过从一个地方改为另一个地方安全我得到的是:即使是0.001%的利润也是如此。
换句话说:虽然在非常罕见的情况下,你处于内循环并且必须每微秒挤出一次,你可以重新考虑这个选择。在任何其他情况下:使用gettors / settors。
PS:读这个q的另一个答案。让我觉得我可能会误解。如果是这样,请发表评论
编辑:Jon S.提到虚拟属性没有被优化掉,这是正确的。但是,无论
,小额利润的故事情节仍然存在答案 2 :(得分:1)
您可能希望接受IDataRecord
而不是IDataReader
,因为这是描述您将关注的DataReader部分的“基本类型”。
否则,我会使用属性。会没事儿的。我不会将它们标记为“虚拟”。赔率是这种类型并不是真正意图继承,如果是这些属性可能不应该被触及。