【发布时间】:2014-05-13 08:52:29
【问题描述】:
我问了一个问题,here 回答了我在大量 数据集合中遇到的性能问题。 (用 linq 创建)
好吧,我们先放一边。
但 Marc 建议的一项有趣(并且天才)优化是 Batchify linq 查询。
/*1*/ static IEnumerable<T> Batchify<T>(this IEnumerable<T> source, int count)
/*2*/ {
/*3*/ var list = new List<T>(count);
/*4*/ foreach(var item in source)
/*5*/ {
/*6*/ list.Add(item);
/*7*/ if(list.Count == count)
/*8*/ {
/*9*/ foreach (var x in list) yield return x;
/*10*/ list.Clear();
/*11*/ }
/*12*/ }
/*13*/ foreach (var item in list) yield return item;
/*14*/ }
在这里,Batchify 的目的是确保我们不会帮助 通过在每次操作之间花费大量时间来服务器过多 - 数据是按 1000 个批次发明的,每批都是制作的 很快就能买到。
现在,我了解它在做什么,但我无法分辨出区别,因为我可能错过了它的实际工作方式。 (有时你认为你知道一些事情......直到......)
好的,回到基础:
AFAIK ,Linq 像这条链一样工作 - :
所以,我们不能开始枚举直到select in 的结果:
Where-->OrderBy-->Select
完成了。
所以基本上我 等待 select 获得 所有 正确数据(之后 where 之后 orderby) ,并且只有这样 - 我的代码可以触及这些值。 (来自select)
但根据我对Marc的回答的理解,那些yields之间似乎有一个差距,允许其他资源做某事......(?)
如果是这样,那么在 #4 的每次迭代之间,在 line#9 之后,CPU 有时间做其他事情吗?
问题
- 有人可以帮忙吗?这是如何工作的?
nb
我已经知道(例如)select 只不过是:
public static IEnumerable<TResult> Select<TSource,TResult>
(this IEnumerable<TSource> source, Func<TSource,TResult> selector)
{
foreach (TSource element in source)
yield return selector (elem![enter image description here][3]ent);
}
但如果是这样,我的代码在计算所有值(where 之后,orderby 之后)之前无法触及它......
编辑:
对于那些询问是否有区别的人:http://i.stack.imgur.com/19Ojw.jpg
2 秒用于 1M 个项目。 5M 项 9 秒。
(忽略时间的第二行,(额外的console.write行)。)
这里是 5m 列表:http://i.stack.imgur.com/DflGR.jpg(第一个是 withBatchify,另一个不是)
【问题讨论】:
-
我喜欢用图片提问。它对读者有很大帮助。
标签: c# performance linq