哪个更快?循环对象属性或linq查询?

时间:2011-07-14 22:20:21

标签: asp.net linq reflection

这是否更快

var query = from prop in object.GetType().GetProperties()
            where prop.Name == "Id"
            select prop;

var singleProperty = query.SingleOrDefault();
//do stuff with singleProperty

比这个?

var type = object.GetType();
foreach(var prop in type.GetProperties())
{
  if(prop.Name == "Id")
   {
     //do stuff
   }
}

反过来?或者它们是一样的吗? 为什么以及如何知道?

很抱歉在我的问题中过于直接。我更喜欢第一个,但我不知道为什么或是否应该。

感谢。

3 个答案:

答案 0 :(得分:4)

从技术上讲,由于中间数据和LINQ抽象,第一种情况可能会分配更多内存并执行更多处理来生成最终结果,而不是第二种情况。但是,在大范围的事物中,时间和内存的数量可以忽略不计,使得您的代码最可靠,而不是最有效的代码。这可能是过早优化的一个例子。

以下是一些参考文献,为什么第一个可能稍慢:

  1. http://www.schnieds.com/2009/03/linq-vs-foreach-vs-for-loop-performance.html
  2. http://ox.no/posts/linq-vs-loop-a-performance-test
  3. http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/23/c-linq-vs-foreach---round-1.aspx

答案 1 :(得分:1)

正确答案是:使用Reflector查看编译器生成的内容。

也就是说,您的LINQ查询使用相同的机制来检索属性列表作为您的其他代码段。它在技术上应该更快,而不涉及linq开销。但是,我希望差异很小(即,不可感知),所以这实际上归结为代码可读性和可维护性决策。

我讨厌LINQ,所以跳过它。

回顾,一年后

我发现LINQ不是我认为的恶魔。我实际上对它的实现印象非常深刻,并花了很多时间看着IL试图找到一个不喜欢它的正当理由。 这就是说:LINQ-to-objects很漂亮。但是,使用数据库处理项目的后代:不要将此作为在客户端上执行所有查询的理由,而不是让数据库服务器执行它非常非常擅长的工作。

答案 2 :(得分:0)

它们在性能方面是相同的,因为LINQ使用deferred execution。但是,LINQ选项中可能存在一些(或不相关的)更大量的内存。

因此,它们在性能和行为方面(有效)相同!

我会选择LINQ版本以提高可读性,因为我喜欢LINQ,但他们都喜欢它们。