Re[165]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.07.16 20:36
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


EP>>>Я вот не думаю что авторы того кода неквалифицированны в C#, тем более там не один человек участвует. И исхожу из этого.

EP>>>Если ты считаешь что они сделали какой-то ужас, то создай тему в соответствующем под-форуме с указанием на недостатки
S>> Это ты считаешь. Мне все равно. Каждый сам решает, что и как. Но это не значит, что с точки зрения выразительности это хорошо.

EP>Так о том и речь что плохо

Но это не говорит о том, что С++ значительно выразительнее C#.


EP>>>>>Непонятно зачем ты патаешься оправдать раздутую реализацию алгоритма (простейшего!) лямбдами, впрочем мне это уже надоело.

S>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.
EP>>>Какую конкретно реализацию?
S>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16

S>>Или ты её не видел?

EP>А, так ты под реализацией имеешь в виду вызов готового алгоритма?

То, что ты показал это реализация на
http://ru.cppreference.com/w/cpp/algorithm/max_element

Заметь, что если

template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
    if (first == last) {
        return last;
    }
    ForwardIt largest = first;
    ++first;
    for (; first != last; ++first) {
        if (*largest < *first) {
            largest = first;
        }
    }
    return largest;
}


Если сюда добавить фильтр на null, селектор для значения, компаратор, тo это мало будет отличаться от варианта по которому ты считаешь, что С++ значительно выразительнее.
Ну и разница, что в С++ итераторы это структуры, а на C# энумераторы это классы.

public static TSource MinItem<TSource, TValue>(
            [NotNull, InstantHandle] this IEnumerable<TSource> source,
            [NotNull, InstantHandle] Func<TSource, TValue> selector,
            [CanBeNull] IComparer<TValue> comparer)
        {
            if (source == null) throw new ArgumentNullException(nameof(source));
            if (selector == null) throw new ArgumentNullException(nameof(selector));

            if (comparer == null)
                comparer = Comparer<TValue>.Default;

            var value = default(TValue);
            var item = default(TSource);
// Ветка для нуллабле
            if (value == null)
            {
                using (var e = source.GetEnumerator())
                {
                    do
                    {
                        if (!e.MoveNext())
                            return item;

                        value = selector(e.Current);
                        item = e.Current;
                    }
                    while (value == null);

                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (x != null && comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
            }
            else // Ветка для валуе типов аналогичной С++
                        // Можно просто применить foreach было бы то же само как и на С++
            {
                using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                        throw NoElementsException();

                    value = selector(e.Current);
                    item = e.Current;
                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
            }

            return item;
        }


Но на этом делать вывод, что

По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.

Для сравнения C#, свежий пример — на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.

даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.
Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 09.07.2016 20:57 Serginio1 . Предыдущая версия .
Re[166]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 09.07.16 20:53
Оценка: -1
Здравствуйте, Serginio1, Вы писали:

S>>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.

EP>>>>Какую конкретно реализацию?
S>>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16

S>>>Или ты её не видел?
EP>>А, так ты под реализацией имеешь в виду вызов готового алгоритма?
S>То, что ты показал это реализация на
S>http://ru.cppreference.com/w/cpp/algorithm/max_element

Вообще-то нет, например у меня был ещё и selector.

S> Если сюда добавить фильтр на null


В том-то и дело что не нужно сюда добавлять фильтр на null — как и любой другой фильтр он реализуется ортогонально. Его добавили из-за проблем самого C#.
И я тебе уже это говорил в другой теме. Теперь ты и эту зафлудил

S> даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.

S> Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.

Ты нормальный? С чего мне перед тобой извинятся? Может я оклеветал тебя? Так покажи.
Вариант на сотни строк до сих пор лежит у них в репозитории. Если думаешь что они как-то неправильно закодировали — иди в соответствующий под-форум.
Re[168]: [БД] Теоретическая красота и скорость C++
От: Evgeny.Panasyuk Россия  
Дата: 09.07.16 21:16
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>linq2db — не надо. А sqlpp — надо. Это полуфабрикат, он не является ни OR/M ни слоем абстракции, так утверждает его автор, поддерживает три с половиной БД. Следовательно — надо погружаться в дикие извраты, хотя бы для поддержки Оракла или DB2.

EP>>1. В данном контексте речь идёт про проекции, а не про конкретно sqlpp11.
I>"Точно также как ему не нужно знать например детали компиляции мэппинга внутри linq2db, и остальные десятки тысяч строк"
I>Не надо знать — потому что Linq2Db все заявленое умеет и все нужные базы тоже умеет. А если вдруг он начнет ровно три с половиной базы поддерживать, то каждому юзеру придется полностью раздраконить не только маппинг, но и вообще всё.

Учу читать:

EP>1. В данном контексте речь идёт про проекции, а не про конкретно sqlpp11.
EP>2. Даже если брать sqlpp11 с его проекциями, то отсутствие поддержки Oracle вообще параллельно тому получится ли у конечно пользователя использовать проекции на других базах. Это очередное передёргивание с твоей стороны

Re[167]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.07.16 21:26
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


S>>>>>> Я тебе показал реализацию которая компактнее реализации на C#. Ты же сам согласился выше.

EP>>>>>Какую конкретно реализацию?
S>>>> Хотошо. Напомню.https://rsdn.ru/forum/philosophy/6489023.1
Автор: Serginio1
Дата: 01.07.16

S>>>>Или ты её не видел?
EP>>>А, так ты под реализацией имеешь в виду вызов готового алгоритма?
S>>То, что ты показал это реализация на
S>>http://ru.cppreference.com/w/cpp/algorithm/max_element

EP>Вообще-то нет, например у меня был ещё и selector.

У
S>> Если сюда добавить фильтр на null

EP>В том-то и дело что не нужно сюда добавлять фильтр на null — как и любой другой фильтр он реализуется ортогонально. Его добавили из-за проблем самого C#.


Дааааа? Приведу пример работы с базами данных. Там null это повсеместное явление при соединениях.
Это как раз проблемы С++.
EP>И я тебе уже это говорил в другой теме. Теперь ты и эту зафлудил
Я жду от тебя извинений за твои слова о том.
S>> даже в данном варианте на C# 30 строк. При этом используя foreach можно сокаратить до С++ кода. Но даже этот вариант меньше чем ты нашел где то сотни строк.


S>> Я кстати извинился за 2 раза. Жду от тебя извинений за несколько сотен строк.


EP>Ты нормальный? С чего мне перед тобой извинятся? Может я оклеветал тебя? Так покажи.

EP>Вариант на сотни строк до сих пор лежит у них в репозитории. Если думаешь что они как-то неправильно закодировали — иди в соответствующий под-форум.

Где я тебе показал на 30 строк. При этом вариант на C++ при сравнении на null будет аналогичным.
Я думаю о том, что ты не знаешь C#, но делаешь свои умозаключения на коде, в котором ничего не понимаешь. И то, что данный алгоритм можно решить так же как и на С++.
В библиотеке std тысячи строк. И что с того?
Для примера покажу вариант на давай рассмотрим вариант std без селектора и компаратора.
Можешь сам добавить и посчитаем, сколько строк. Еще раз при работе с БД null это нормальное явление при левых соединениях

template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
    if (first == last) {
        return last;
    }
    ForwardIt largest = first;
    ++first;
    for (; first != last; ++first) {
        if (*largest < *first) {
            largest = first;
        }
    }
    return largest;
}


// Но вот их вариант но с компаратором, и селектором
  using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                        throw NoElementsException();
                    item = e.Current;
                    value = selector(item);
                    
                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                }
  return item;


И где же это существенная алгоритмическая выразительность?
Мало того, по мне, так для многих арифметика указателей многим не понятна (я её прекрасно понимаю и она мне нравится)
Для обычного программиста код на C# просто понятнее

Другое дело, что для расширений нужно брать Linq и не парится с ручной работой с итераторами.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 09.07.2016 21:40 Serginio1 . Предыдущая версия . Еще …
Отредактировано 09.07.2016 21:33 Serginio1 . Предыдущая версия .
Отредактировано 09.07.2016 21:30 Serginio1 . Предыдущая версия .
Отредактировано 09.07.2016 21:29 Serginio1 . Предыдущая версия .
Re[166]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 09.07.16 21:28
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Ты ни разу не объяснил, почему оптимизацию под платформу надо записывать в алгоритмическую выразительность.

EP>>Потому что это реальный код, написанный из вполне практических соображений.
I>Следовательно, если я напишу на С++ тот же код из десяти тысяч строк, это и будет доказательством более худшей алгоритмической выразительности языка С++.

Если у тебя будут какие-то номинальные алгоритмические познания, и ты напилишь десять тысяч строк для поиска минимального элемента из каких-то реальных практических соображений, а не исключительно ради раздувания кода — тогда и поговорим.

EP>>Нет, очевидно не на этот. Толку-то от минимально работающей если она не устраивает по разным параметрам?

I>Что бы оценивать свойства компилятора отдельно от свойств платформу и все это отдельно от свойств языка.

А зачем их все отдельно оценивать? Как будто в случае C# есть какой-то реальный выбор их на что-то заменить.
Есть задача реализовать алгоритм под реальную практическую задачу, при реализации приходится делать много лишних движений, повторятся, генерировать код как текст и т.п. — это плохо, а из-за чего конкретно плохо — дело десятое, так как нет реальной альтернативы для замены
Re[168]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 09.07.16 21:43
Оценка: -2 :)
Здравствуйте, Serginio1, Вы писали:

S>>> Если сюда добавить фильтр на null

EP>>В том-то и дело что не нужно сюда добавлять фильтр на null — как и любой другой фильтр он реализуется ортогонально. Его добавили из-за проблем самого C#.
S> Дааааа? Приведу пример работы с базами данных. Там null это повсеместное явление при соединениях.
S> Это как раз проблемы С++.

Я не говорю что не нужно фильтровать. Я говорю что фильтрацию не нужно встраивать в алгоритм поиска минимального элемента — это ортогонально.
Вот представить что тебе нужно отфильтровать не null, а все чётные — будешь писать отдельный алгоритм min_odd_element?

S>Я думаю о том, что ты не знаешь C#, но делаешь свои умозаключения на коде, в котором ничего не понимаешь.


Всё, надоел, по несколько раз одно и то же
Re[169]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.07.16 22:04
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Serginio1, Вы писали:


S>>>> Если сюда добавить фильтр на null

EP>>>В том-то и дело что не нужно сюда добавлять фильтр на null — как и любой другой фильтр он реализуется ортогонально. Его добавили из-за проблем самого C#.
S>> Дааааа? Приведу пример работы с базами данных. Там null это повсеместное явление при соединениях.
S>> Это как раз проблемы С++.

EP>Я не говорю что не нужно фильтровать. Я говорю что фильтрацию не нужно встраивать в алгоритм поиска минимального элемента — это ортогонально.

EP>Вот представить что тебе нужно отфильтровать не null, а все чётные — будешь писать отдельный алгоритм min_odd_element?

Еще раз для я тебе показал алгоритм на Linq. Но он состоит из 4 строк. Если часто используешь, то стоит сделать алгоритм из 10
строк, что бы использовать одну.
S>>Я думаю о том, что ты не знаешь C#, но делаешь свои умозаключения на коде, в котором ничего не понимаешь.

EP>Всё, надоел, по несколько раз одно и то же

Правильно ты не можешь согласиться с тем, что не прав.
Ты сделал вывод на выразительности на основании того, что ктото ипользовал алгоритм поиска вручную. Тебе привели пример как можно использовать Linq https://rsdn.ru/forum/flame.comp/6497123.1
Автор: Serginio1
Дата: 09.07.16
на, что ты https://rsdn.ru/forum/flame.comp/6497160.1
Автор: Evgeny.Panasyuk
Дата: 09.07.16


А, так ты под реализацией имеешь в виду вызов готового алгоритма?


При этом ты то при твои утвеждения, что считаешь, что они верны

По алгоритмической выразительности среди мэйнстрима C++ сейчас впереди всех.
Для сравнения C#, свежий пример
— на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.

Ещё ДО отрабатывания T4, кода на C# больше, и его труднее поддерживать, ибо это склейка кода как текста.

А на то, что тебе приводят код на Linq более лаконичный тебе глубоко плевать. Но при этом будет 2 прохода.
Ребята решили оптимизировать и сделали за один проход. Другое дело, что фильтр оптимизирован и нужно было использовать только один проход с фильтром на Nullable типы
Надо признавать ошибки. И доказвать там, где хорошо знаешь область. От того, что ты прекрасно знаешь С++, не говорит, что ты автоматом разбираешься в C++ или 1С.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 09.07.2016 23:04 Serginio1 . Предыдущая версия . Еще …
Отредактировано 09.07.2016 22:17 Serginio1 . Предыдущая версия .
Re[70]: Тормознутость и кривость linq
От: Evgeny.Panasyuk Россия  
Дата: 09.07.16 23:32
Оценка:
IT>>Дайте паттерн матчинг в C# и отжать всё лишнее из генерируемого SQL вообще будет не проблема.
EP>В C++ кстати есть PM для expression templates, причём аж в C++1998. То есть можно отматчить искомый фрагмент дерева запроса, и провести оптимизацию, или например выдать ошибку.
EP>Я уже показывал
Автор: Evgeny.Panasyuk
Дата: 24.04.15
пример на эту тему


Вот более конкретный пример. Запрос:
auto q = from
(
    from
    (
        from(foo).where(foo.id > 40_i).select(foo.id)
    ).where(foo.id > 41_i).select(foo.id)
).where(foo.id > 42_i).select(foo.id);

Изначально генерируется следующий код (условия тестовые, пока нет псевдонимов, но не суть):
SELECT foo.id FROM
(
    SELECT foo.id FROM
    (
        SELECT foo.id FROM foo WHERE foo.id>40
    ) WHERE foo.id>41
) WHERE foo.id>42

Этот код генерирует функция:
template<typename Source, typename Condition, typename ...Columns>
constexpr auto make_sql
(
    Source source,
    Condition condition,
    Columns... columns
)
{
    return concat
    (
        CTQL_STRING("SELECT "), concat_columns(columns...),
        CTQL_STRING(" FROM "), source_string(source),
        skip_if_empty(condition, concat(CTQL_STRING(" WHERE "), condition))
    );
}

Добавляем следующую перегрузку для запросов с подзапросом во FROM, что по сути является PM времени компиляции:
template
<
    typename SubSource, typename SubCondition, typename ...SubColumns,
    typename Condition, typename ...Columns
>
constexpr auto make_sql
(
    query<SubSource, SubCondition, SubColumns...>,
    Condition condition,
    Columns... columns
)
{
    return make_sql
    (
        SubSource{},
        concat(condition, CTQL_STRING(" AND "), SubCondition{}),
        columns...
    );
}

Эта перегрузка разбирает внутренний запрос, делает внутренний FROM внешним, и склеивает условия, после чего уходит в рекурсию.
При наличии такой перегрузки генерируемый запрос приобретает вид:
SELECT foo.id FROM foo WHERE foo.id>42 AND foo.id>41 AND foo.id>40

Паттерн естественно может быть и более "многоэтажным", для более глубокого матчинга по дереву выражения.
Re[167]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.16 06:48
Оценка: +1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Нет, очевидно не на этот. Толку-то от минимально работающей если она не устраивает по разным параметрам?

I>>Что бы оценивать свойства компилятора отдельно от свойств платформу и все это отдельно от свойств языка.

EP>А зачем их все отдельно оценивать? Как будто в случае C# есть какой-то реальный выбор их на что-то заменить.


Для того, что бы знать, что именно и как надо улучшать — в языке, а плафтформе, в программе, библиотеке.
Если проблема в языке — меняем язык, проверяем. Опаньки — ровно та же проблема и в С++ .Net. И в F# и вообще в любом доступном языке на этой платформе.

Язык поменяли, пробелема осталась — гы-гы. Это про твою логику

Отсюда ясно, что смотреть надо или в либы, или в программу, или платформу. Если в программе нельзя соптимизировать, другого алгоритма в библиотеке нет, то надо пробовать другую платформу — заюзать нативный код.

А если думать, как ты — "выхода нет, всё пропало", остаётся только голову пеплом посыпать.

EP>Есть задача реализовать алгоритм под реальную практическую задачу, при реализации приходится делать много лишних движений, повторятся, генерировать код как текст и т.п. — это плохо,


А что плохо ? Код писать твоя работа. А вот экономический эффект и показывает, что хорошо, а что плохо.
И вот здесь оказывается, что весь такой плохой С# убрал хороший С++ со сцены. С выходом C# почти все виндовые сиплюсники перешли на С#. Именно экономика и говорит, что плохо, а количество строчек — это вообще дело десятое.

> а из-за чего конкретно плохо — дело десятое, так как нет реальной альтернативы для замены


Эти проблемы есть вообще во всех языках на платформе .Net, даже С++ будет обладать теми же недостатками — он будет много медленнее нативного. Джит никогда не сможет справиться с обычным компилятором.

То есть, ты продолжаешь сравнивать разные платформы, но при этом цепляешься к конкретному языку.
Re[71]: Тормознутость и кривость linq
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.16 06:56
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>В C++ кстати есть PM для expression templates, причём аж в C++1998. То есть можно отматчить искомый фрагмент дерева запроса, и провести оптимизацию, или например выдать ошибку.

...
EP>Паттерн естественно может быть и более "многоэтажным", для более глубокого матчинга по дереву выражения.

Теперь повтори этот же фокус для динамического запроса.
Re[168]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.07.16 07:36
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Эти проблемы есть вообще во всех языках на платформе .Net, даже С++ будет обладать теми же недостатками — он будет много медленнее нативного. Джит никогда не сможет справиться с обычным компилятором.


Но может значительно приблизиться
NET Native – что это означает для разработчиков под универсальную Windows-платформу

Как .NET Native повлияет на меня и мое приложение?

Конкретные показатели могут отличаться, но в большинстве случаев ваше приложение будет запускаться быстрее, работать с большей скоростью и потреблять меньше системных ресурсов.
•До 60% повышения скорости холодного старта
•До 40% повышения скорости горячего старта
•Уменьшенное потребление памяти при компиляции в машинный код
•Нет зависимости от десктопного .NET Runtime при установке


Так как ваше приложение скомпилировано в машинный код, вы получите прирост производительности, связанный со скоростью выполнения нативного кода (близко к производительности C++). При этом вы по-прежнему можете пользоваться преимуществами индустриальных языков программирования C# или VB и связанных инструментов.

Вы также можете продолжать использовать всю мощь программной модели, доступной в .NET с широким набором API для описания бизнес-логики и со встроенными механизмами управления памятью и обработки исключений.
Другими словами, вы получаете лучшее из обоих миров: управляемая разработка с производительностью близкой к С++. Это ли не прекрасно?


Правда при этом теряется возможность огульной рефлексии ну и разного рода ограничения.

Компиляция приложений с помощью машинного кода .NET
.NET Native: создание двоичных файлов машинного кода
и солнце б утром не вставало, когда бы не было меня
Отредактировано 10.07.2016 8:07 Serginio1 . Предыдущая версия .
Re[169]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Ночной Смотрящий Россия  
Дата: 10.07.16 07:59
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вот представить что тебе нужно отфильтровать не null, а все чётные — будешь писать отдельный алгоритм min_odd_element?


Вот только в обсуждаемом алгоритме не фильтрация null, а особое поведение основного алгоритма в случае null.
Re[170]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 10.07.16 09:12
Оценка: -2
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Вот представить что тебе нужно отфильтровать не null, а все чётные — будешь писать отдельный алгоритм min_odd_element?

НС>Вот только в обсуждаемом алгоритме не фильтрация null, а особое поведение основного алгоритма в случае null.

1. Это особое поведение ортогонально алгоритму и выносится за скобки, в том числе с помощью фильтрации, а не копипастится.
2. Сама необходимость какой-то особой семантики в зависимости от рода типа
Автор: Evgeny.Panasyuk
Дата: 23.03.16
— жесть ещё та, и совсем не выразительно.
3. Исключение для индикации "NoElements" на алгоритме такого уровня — тоже жесть.
Re[171]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Ночной Смотрящий Россия  
Дата: 10.07.16 09:18
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>3. Исключение для индикации "NoElements" на алгоритме такого уровня — тоже жесть.


Ты просто, как обычно, не в теме. Min/MaxBy копирует семантику Min/Max, а она, в свою очередь, такая и для коллекций, и для доступа в БД. Вот последнее как раз и является причиной не совсем очевидного на первый взгляд поведения.
Re[172]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 10.07.16 09:29
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>3. Исключение для индикации "NoElements" на алгоритме такого уровня — тоже жесть.

НС>Ты просто, как обычно, не в теме.

Вообще-то уже в теме
Автор: AndrewVK
Дата: 23.03.16
.

НС>Min/MaxBy копирует семантику Min/Max, а она, в свою очередь, такая и для коллекций, и для доступа в БД. Вот последнее как раз и является причиной не совсем очевидного на первый взгляд поведения.


Причины могут быть какие угодные. Я же например не говорю что авторы в рамках языка/платформы неправильно поступили. Я говорю что плох тот языка/платформа на которых необходимы такие извраты для простейших алгоритмов
Re[168]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 10.07.16 09:47
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Есть задача реализовать алгоритм под реальную практическую задачу, при реализации приходится делать много лишних движений, повторятся, генерировать код как текст и т.п. — это плохо,

I>А что плохо ? Код писать твоя работа.

Конечно плохо, но некоторые действительно так и пишут целые простыни, от забора и до обеда

I>А вот экономический эффект и показывает, что хорошо, а что плохо.


Это уже передёргивание с алгоритмической выразительности на сферический экономический эффект.
Re[173]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Ночной Смотрящий Россия  
Дата: 10.07.16 09:47
Оценка: +1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Причины могут быть какие угодные. Я же например не говорю что авторы в рамках языка/платформы неправильно поступили. Я говорю что плох тот языка/платформа на которых необходимы такие извраты для простейших алгоритмов


Извраты необходимы не из-за платформы/языка, а из-за предметной области — БД. А вот то что ты все вывернул опять на изнанку демонстрирует, что правда тебе не интересна, тебе интересны исключительно твои теории.
Re[174]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Evgeny.Panasyuk Россия  
Дата: 10.07.16 09:58
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Причины могут быть какие угодные. Я же например не говорю что авторы в рамках языка/платформы неправильно поступили. Я говорю что плох тот языка/платформа на которых необходимы такие извраты для простейших алгоритмов

НС>Извраты необходимы не из-за платформы/языка, а из-за предметной области — БД.

Например вот это дублирование — 1, 2 — из-за БД? А может быть вот этот мрак из-за БД?

НС>что правда тебе не интересна


Цирк с конями, клеветник
Автор: Evgeny.Panasyuk
Дата: 06.07.16
что-то вещает про правду
Re[175]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.07.16 11:03
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ночной Смотрящий, Вы писали:


EP>>>Причины могут быть какие угодные. Я же например не говорю что авторы в рамках языка/платформы неправильно поступили. Я говорю что плох тот языка/платформа на которых необходимы такие извраты для простейших алгоритмов

НС>>Извраты необходимы не из-за платформы/языка, а из-за предметной области — БД.

EP>Например вот это дублирование — 1, 2 — из-за БД? А может быть вот этот мрак из-за БД?


Вообще это пишется без дублей

public static TSource MinBy<TSource, TValue>(
            [NotNull, InstantHandle] this IEnumerable<TSource> source,
            [NotNull, InstantHandle] Func<TSource, TValue> selector,
            [CanBeNull] IComparer<TValue> comparer)
        {
            Code.NotNull(source, nameof(source));
            Code.NotNull(selector, nameof(selector));

            if (comparer == null)
                comparer = Comparer<TValue>.Default;

            var value = default(TValue);
            TSource item;
                       
// просто добавляем фильтр, он ленивый и будет вызываться во время итерации
            if (value == null)
                               source=source.Where(x=>x!=null);

             
                               using (var e = source.GetEnumerator())
                {
                    if (!e.MoveNext())
                                  { 
                                    // по их алгоритму при пустом списке вызвать исключение для Nullable
                                      if (value == null)
                                        throw NoElementsException();
                                          else
                    return default(TSource); // вернуть default при пустом списке 
                                    }

                    value = selector(e.Current);
                    item = e.Current;
                    while (e.MoveNext())
                    {
                        var x = selector(e.Current);
                        if (comparer.Compare(x, value) < 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                
            }

            return item;
        }


Проблема не в языке. Напиши этот же алгоритм для C++ и мы сравним 100 раз о которых ты декларируешь.
И не смейся а доказывай свои слова.

на C++ десять строк (+ может несколько wrapper'ов, это максимум десятки строк), на C# — несколько сотен строк кода (è1 + è2) причём включая кодогенетратор, который генерирует èнесколько тысяч строк, а алгоритм-то совсем пустяковый.


Можно подумать ты никогда не занимался копи-пасте?


Можно переписать на foreach

if (value == null)
                               source=source.Where(x=>x!=null);

                bool isfirst=true;
                bool fl=0;
                foreach(var item in source)
                {
                   var x = selector(item ); 
                   if (isFirst) 
                      {                  
                      isFirst=false;
                       fl=-1;
                     }
                    else
                      fl=comparer.Compare(item, value);
                                 
                        if (fl< 0)
                        {
                            value = x;
                            item = e.Current;
                        }
                    }
                
                              if (isFirst)
                  
                                  { 
                                    // по их алгоритму при пустом списке вызвать исключение для Nullable
                                      if (value == null)
                                        throw NoElementsException();
                                          else
                    r                   eturn default(TSource); // вернуть default при пустом списке 
                                    }
            return item;


Это не проблема платформы.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 10.07.2016 11:35 Serginio1 . Предыдущая версия . Еще …
Отредактировано 10.07.2016 11:24 Serginio1 . Предыдущая версия .
Отредактировано 10.07.2016 11:06 Serginio1 . Предыдущая версия .
Re[175]: Тормознутость и кривость linq. Compile-time EDSL DB
От: Ночной Смотрящий Россия  
Дата: 10.07.16 12:31
Оценка: +5 -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Например вот это дублирование — 1, 2 — из-за БД?


Глупо задавать вопросы, на которые тебе давно уже дали ответы. Это дублирование из-за того, что для ref-типов есть выделенное значение null, а для value его нету.

EP> А может быть вот этот мрак из-за БД?


А это для лучшего перформанса. Можно смело грохнуть весь этот файл, и все приложения, использующие методы оттуда продолжат успешно компилироваться и работать.

Ну и вообще — это тот самый код, который пишется в универсальных библиотеках и почти не пишется в прикладном коде. Но аналогичная ситуация с чудовищной кашей в твоей шаблонной магии тебя почему то устраивает, а тут прям какая то вселенская проблема и ужас ужас.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.