Я задал вопрос и получил ответы о проблемах с производительностью, которые у меня были с большим набором данных. (созданный с помощью linq)
ok, оставьте его в стороне.
Но одна из интересной (и гениальной) оптимизации, предложенная Марком, заключалась в 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
в:
Where-->OrderBy-->Select
.
Итак, в основном я жду, когда select
будет иметь все правильные данные (после where
, после orderby
), и только тогда - мой код может коснуться этих значений. (полученная из select
)
Но, согласно моему пониманию ответа Marc, кажется, что между этими yields
есть пробел, который позволяет другим ресурсам что-то делать... (?)
Если да, то между каждой итерацией #4
после строки #9
есть время, когда CPU может сделать что-то еще?
Вопрос
- Может кто-нибудь пролить свет, пожалуйста? как это работает?
пь
Я уже знаю, что (например) 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. 9 секунд для элементов 5M.
(игнорируйте вторую строку времени (дополнительная строка console.write).)
вот он для списка 5 м: http://i.stack.imgur.com/DflGR.jpg (первый из них withBatchify, другой нет)