Здравствуйте, Ikemefula, Вы писали:
I>C Linq мы можем небольшими трудозатратами обеспечить ленивые вычисления с некоторыми пенальти. При этом пенальти всё равно будут, всегда, как бы ты ни приседал. Более того — профит будет только в определенной области. Вне её эти пенальти начинают перевешивать все бенефиты.
I>Например, если в числодробилке время в итерациях процентов 80%, то это значит, что можно соптимизировать по CPU раза в два-три просто отказавшись от Linq.
I>В обычных задачах на сами итерации расходуется ничтожное количество времени. Потому замедлив участок даже в 10 раз, ты в целом ничего не теряешь, т.к. компенсация благодаря ленивым вычислениям может дать гораздо больше.
I>Или например в интерактивных сценариях нас вобщем не сильно заботит загрузка процессора, в отличие от серверных. Ну вырастет время обработки данных с милисекунд до десятков или сотен милисекунд — ничего страшного.
I>Потому мерить надо не абы что, а смотреть контекст и долю linq в вычислениях.
Это все прекрасно но как это связано с
Еще нужно добавить про yield и ленивое выполнение.
То есть при выполнении цепочки
list.Where.Where.Select.Count
List пройдет всего один цикл ибо выполнение начнется с права на лево
Count вызовет MoveNext у Select, Select у Where и так далее.
По этому мы можем объединять Where без потери производительности на лишние циклы
Я говорил про yield и ленивые вычисления при которых происходит вычисление справа на лево и избавляемся от лишних циклов?