Re[12]: Есть ли подобие LINQ на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.04.21 13:14
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> да если я напишу свое расширение


S>
S>public static IEnumerable<T> AlternateElements<T>(this IEnumerable<T> source)
S>{
S>    int i = 0;
S>    foreach (var element in source)
S>    {
S>        if (i % 2 == 0)
S>        {
S>            yield return element;
S>        }
S>        i++;
S>    }
S>}
S>

S> То как видишь никаких тормозов на лямбдах нет

Вспоминаем, про что была речь

расходы yield и всякие лябмды равны

Выделенное ты упустил. А между тем yeild съест намного больше, чем if и %

То есть, осталось показать, как обнулить расходы и на yield. Без переписывания, как это теоретически может сделать компилер или джит, не выйдет.

S> Вообще то сказано было про то, что не будет лишних циклов из за ленивости. Но ты начал про тормоза лямбд. Про оптимизацию лямбд я тебе пишу но ты не читаешь. Ты ухватил только


Глаза раскрой — yield и лямбды.

S>"По этому мы можем объединять Where без потери производительности"


Ога.

S> Тогда прошу прощения. Сказано было в контексте лишних циклов. То есть если бы не ленивые вычисления, то были бы лишние циклы.


Ленивость можно сделать и без linq. И точно так же расходов будет меньше, как раз на этот самый yield.

И точно так же это проявится на большом количестве запросов. Загрузка процессора увеличится во столько раз, во сколько yield превышает твои if и %

I>>В дженериках интерфейсы и делегаты? Ты бы яснее мысли выражал.

S> Для сортровок и прочих обобщенных действий передаются для каждого типа интерфейсы или делегаты

И что с того?

S>"По этому мы можем объединять Where без потери производительности на лишние циклы"

S> Нет, но она значительно меньше если писать расширения без yield, потому что придется вычислять слева направо с кучей лишних циклов.

Не недо никаких лишних циклов. Ты руками то пробовал ленивость реализовывать?

S>Но на MoveNext ты все равно будешь тратиться. Единственный минус как тут правильно заметил Ночной Смотрящий это создание экземпляров классов итераторов при небольшом количестве элементов


Именно. MoveNext, издержки из за использования интерфейса и забрасываем гц мелкими объектами. Ты точно уверен, что гц выдержит любое количество таких объектов?

I>>По твоему, проблемы нет, потому есть её решение ? Если надо изыскивать особые комбинаторы, это значит, что просто так само работать не будет.

S>Если есть проблема которую можно решить через раширение то почему бы и нет?

Итого — проблема то есть.

I>>Еще одно решение для проблемы которой нет. Ты сам то понял, что показываешь? На кой ляд этот Рослин, если издержки yield равны нулю?

S> Главная фишка roslyn-linq-rewrite не yield а инлайнинг лямбд. Кстати например во многих сценариях yield удобнее так как не выделяет лишнюю память

Вот-вот. Покажи как от yield избавиться.

I>> Процитируй, где именно я призываю отказаться от linq ?


S>Ну ты же пишешь про тормоза везде и во всем но при этом отметаешь любые оптимизации.


Я пишу о том, что пенальти на yield есть всегда. Странно с этим спорить. Стоимость итерации вполне осязаема.
Пенальти и тормоза это разные вещи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.