【问题标题】:Which is faster? Loop over object properties or linq query?哪个更快?循环对象属性或 linq 查询?
【发布时间】:2012-04-18 07:08:52
【问题描述】:

这样更快吗

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
   }
}

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

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

谢谢。

【问题讨论】:

    标签: asp.net linq reflection


    【解决方案1】:

    从技术上讲,由于中间数据和 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

    【讨论】:

    • 但是如果你不评估整个 IEnumerable,它可能会处理更少的数据......例如,ToList() 就是这样做的。
    • 有道理。我很好奇是否还有其他观点。感谢您输入 mellamokb。
    • @Daniel。如果您不进行评估,您将如何访问属性的名称和值?
    • First() 例如...如果您只需要返回第一个属性,您可以停在那里。与在 prop.Name=="id" 上带有 break 的 foreach 相同。这个想法是生成器支持 IEnumerable,您无需评估所有元素即可获得其中的一个子集。
    • @丹尼尔+1。我对 SingleOrDefault() 和 ToList() 变得懒惰了。
    【解决方案2】:

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

    也就是说,您的 LINQ 查询使用与其他 sn-p 相同的机制来检索属性列表。在不涉及 linq 开销的情况下,它在技术上应该更快。但是,我希望差异很小(即无法察觉),因此这实际上归结为代码可读性和可维护性决定。

    我讨厌 LINQ,所以跳过它。

    一年后回顾:

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

    【讨论】:

    • 因为用类似 SQL 的查询来混淆 C# 源代码感觉就像是糟糕的编码。
    • 我想我对使用一堆结构相同的 for/foreach 循环来简单处理数据集合的代码也有同样的感觉。正如@Reddog 所说,每个人都有自己的:-)
    • @David Lively,这是主观的、好争论的和热情的。它与主题无关。另外,请查看我的帖子和 MEMark 的帖子,并告诉我它并没有使它更清楚.. stackoverflow.com/questions/6616633/…
    • @大卫。您的跟进让我微笑,因为我讨厌尝试查看 foreach 括号。我想这只是个人喜好。谢谢。
    • @Filip 着火了?我回答了这个问题,并就特定技术的价值提供了个人看法。这几乎没有燃烧。
    【解决方案3】:

    它们在性能方面是相同的,因为 LINQ 使用了deferred execution。但是,LINQ 选项可能会占用大量(且无关紧要)的内存。

    因此,它们在性能和行为上(实际上)是相同的!

    为了可读性,我会选择 LINQ 版本,因为我喜欢 LINQ,但每个人都有自己的。

    【讨论】:

    • 不要挑剔,但如果一个解决方案需要更多内存,它们就不能具有相同的性能。分配/解除分配、GC 等都需要时间。
    • 还有一个事实是,foreach 使用了一个被操纵的类来迭代数组。由于使用指针和调用函数,对该迭代器类的每次调用都会对性能造成影响。常规的 for 循环通常是最快的。但如果涉及到排序,linq 有一些巧妙的技巧可以让它更快。
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多