LINQ与匿名LAMBDA性能:何时使用每个

我喜欢匿名lambda表达式; 他们让你简洁地表达从列表中选择复杂。 LINQ做类似的东西,所以我想我会尝试一下(最终)。

正如有人谁使用lambda表达式经常选择的集合的子集当我应该使用LINQ当我应该使用lambda表达式?有这样的其中一个显示性能的一种方式或其他一10-100差异的问题。

--------------解决方案-------------

LINQ评估推迟。 为表达primesnumbers.Where(n => isOddAndNotDivisibleBy(n))是相同的编译器。 在这两种情况下, isOddAndNotDivisibleBy不会被调用,直到事情计算表达式的结果。 在这种情况下, ToArray之间cb强制评估。 如果你之间增加ToArray的ab ,你会得到类似的时间。

进行比较,你可以试试:

var primes = (
from n in numbers
where isOddAndNotDivisibleBy(n)
select n).ToArray();

你叫什么?“LINQ”,实际上是所谓的LINQ查询语法。 你什么CAL“匿名的lambda”其实所谓LINQ方法的语法。 重要的是,表达式:

from n in numbers
where isOddAndNotDivisibleBy(n)
select n

实际上转化为这个编译之前:

numbers.Where(n => isOddAndNotDivisibleBy(n))

这意味着,如果你直接使用前者还是后者,你会得到相同的IL代码。

因此,差异有在别处。 而且它的ToArray()调用。 Where()是懒惰。 这意味着它几乎没做什么,除非你确实在以某种方式或另一种结果序列迭代。 这意味着,只调用Where()将是近了瞬间。 但如果调用ToArray()集合实际上是重复,其结果是立即计算出来。 这就是为什么你看到如此巨大的差异。

编辑:

修改后的问题:为什么使用一个语法比其他? 主要是选择一个更具有可读性。

有一些方法和重载,你不能使用的查询语法(快递First() Aggregate() Concat() Zip()的引入指数,...,过载)。 但是你可以使用一个语法查询的一部分,另一个用于休息。

也有查询语法不能使用方法的语法很容易地表示一个强大的功能:使用时透明的标识符,如let条款。

但至少有正确使用时两种语法之间没有性能差异。

你的测试是不一样的:你在呼唤ToArray()之间的bc ,实际执行您的查询后,将分配(然后重新分配,然后重新分配)内存。

之间的ab ,您只需创建,在执行时,将执行计算查询。 调用ToList() ToArray()或通过迭代查询foreach循环实际上会迫使其执行; 应采取几乎excatly的时间是相同的,因为它会从查询理解语法被翻译成一系列的匹配你的第二个测试扩展方法调用。

最后,不要使用DateTime.Now的时间; 使用StopWatch

因为你没有执行LINQ一位刚刚做的primes .ToArray()然后对它们进行比较。 其实这是LINQ的递延执行行为 ,它只是创建查询,并没有运行它,直到你有一些功能执行它像, foreachToList ,...

另外两个你做的事情是LINQ,因为两者都是使用枚举类的IEnumerable的一些扩展方法,只是第一个是查询语法和第二个是点表示法语法。 看到他们在MSDN LINQ。

无论这些案件中,的确都是相同的LINQ查询,但具有不同的语法糖。

我是什么意思的查询? LINQ查询,不管你用它创建mySequence.Where(i => i > 5)或者(from item in mySequence where item > 5)存储的唯一数据是,它允许你列举的顺序。

当你ToArrayToListToDictionaryforeach ,该序列进行评价,这就是为什么你有这样一个巨大的性能差距-即你的第一个查询未评估。 永远。

分类:性能 时间:2015-03-15 人气:0
本文关键词: 性能,LINQ,拉姆达
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.025 (s). 10 q(s)