查询字符串属性vs方法调用



是否有任何或明显的性能下降;当使用linq查询字符串属性vs方法调用来获取字符串值;在ienumerable列表中?如果不是;linq是否有其他可查询的接口使性能有所不同?

我是说;

public class MyForm
{
    public string FormName {get; set;}
    public string GetFormName()
    {
      return FormName;
    }
}
List<MyForm> MyFormList;
//1)
var result = MyFormList.Where(f=>f.FormName=="SalesForm").SingleOrDefault();
//2)
var result = MyFormList.Where(f=>f.GetFormName()=="SalesForm").SingleOrDefault();

选项1和选项2之间是否有明显的性能下降?在执行linq查询时,除了ienumerable之外,是否有。net使用任何技术对字符串属性进行索引以获得最佳性能?那linq还能查询吗?

我的假设;因为ienumerable只迭代所有项;访问字符串属性与调用相关方法获取字符串值没有太大区别。

我说的对吗?

属性方法。属性在编译时被转换成(一对)方法。(通常抖动会内联这些方法,所以没有任何调用堆栈性能损失)。

迭代IEnumerable 查看每一项。在某些情况下,它可能在幕后构建HashSet,但它仍然需要为序列中的每个项至少做一次,无论是属性还是方法,并且所包含的IEnumerable操作符(据我所知)都没有区别对待这两个操作符。

你可能看到的区别是在任何额外的工作,该方法可能做或不做,以获得您需要的结果。如果属性或方法本身本来就更快,那么在linq表达式求值期间反复调用时,这些微小的差异就会累积起来。

是的,IEnumerable将以O(n)复杂度进行线性搜索。返回字符串的字段、属性或方法调用之间不太可能存在可测量的差异(如果确实重要,请务必测量)。

如果您需要更快的查找-字典是O(1)查找的更好选择。

指出

  • 如果你用Linq-to-SQL查询数据库,这样的属性访问将被转换为SQL查询,并且可能被SQL优化为接近0(1)索引字段。
  • 属性是一个方法,因此自动属性和直接返回后台文件的方法应该具有相同的性能。在您的示例中,您有返回属性值的方法,该方法反过来返回支持字段的值,这可能会导致一些差异,但无论如何,这两个调用都很有可能被JIT内联。
  • 你可以实现你自己的IQueryable源代码,以提供优化的搜索/where方法,并将查询编译成Queryable扩展调用,而不是Enumerable的。

最新更新