是否有任何或显着的性能下降;当对字符串属性和方法调用使用linq查询来获取该字符串值时;在IEnumarable列表中?如果不;是否有任何其他可查询的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查询而不是IEnumurable时,是否有任何.NET用于字符串属性的索引以获得最佳性能的技术; linq还能查询吗?
我的假设;因为IEnumarable只是迭代所有项目;访问字符串属性与通过调用相关方法获取字符串值没有太大区别。
我是对的吗?
答案 0 :(得分:2)
属性是方法。在编译时将属性转换为(对)方法。 (通常抖动会内联这些方法,因此对此没有任何调用堆栈性能损失。)
迭代IEnumerable 将查看每个项目。有些情况下它可能会在幕后构建一个HashSet,但它仍然需要对序列中的每个项至少执行一次,无论是属性还是方法,并且所有包含的IEnumerable运算符(据我所知)都没有对待这两个任何不同。
您可能会看到的不同之处在于该方法可能做或不做的任何额外工作,以获得您需要的结果。如果属性或方法本身具有更快的速度,那么在linq表达式求值期间反复调用时,这些小差异可能会相加。
答案 1 :(得分:1)
是的,IEnumerable
将进行O(n)复杂度的线性搜索。返回字符串的字段,属性或方法调用之间不太可能存在可测量的差异(确保测量是否真正重要)。
如果你需要更快的查找 - 使用O(1)查找字典是更好的选择。
注释
Enumerable
个。