这样更快吗
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
}
}
反过来?或者它们是一样的?
你怎么会知道?
谢谢。
从技术上讲,由于中间数据和LINQ抽象,第一种情况可能比第二种情况分配更多的内存并执行更多的处理来生成最终结果。但是时间和内存的数量在大范围内是可以忽略不计的,因此在这种情况下,您最好使您的代码最易读,而不是最有效。这可能是一个过早优化的例子。
这里有一些参考,为什么第一个可能会稍微慢一些:
- http://www.schnieds.com/2009/03/linq-vs-foreach-vs-for-loop-performance.html
- http://ox.no/posts/linq-vs-loop-a-performance-test
- http://geekswithblogs.net/blackrabbitcoder/archive/2010/04/23/c linq - vs - foreach -圆- 1. - aspx
正确的答案是:使用Reflector来查看编译器生成的内容。
也就是说,您的LINQ查询使用与其他代码片段相同的机制来检索属性列表。从技术上讲,它应该更快,而不涉及链路开销。然而,我希望差异是最小的(即,无法察觉),所以这真的归结为代码的可读性和可维护性的决定。
回顾,一年后:
我发现LINQ并不是我想象的那个恶魔。实际上,我对它的实现印象非常深刻,并且花了相当多的时间来研究IL,试图找到一个不喜欢它的正当理由。也就是说:LINQ-to-objects非常灵巧。然而,未来的几代人在使用数据库的项目上工作:不要把这个作为在客户端上执行所有查询的理由,而不是让数据库服务器做它非常非常擅长的事情。
它们在性能方面是相同的,因为LINQ使用延迟执行。然而,一个微不足道的(和不相关的)更大的内存量可能会进入LINQ选项。
因此,它们在性能和行为上(实际上)是相同的!
我将使用LINQ版本的可读性,因为我喜欢LINQ,但每个人都有自己的