Информация об изменениях

Сообщение Re[37]: Есть ли подобие LINQ на других языках/платформах? от 22.04.2021 17:31

Изменено 22.04.2021 17:33 Serginio1

Re[37]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:


I>Именно. x[0] инлайнится враз и стоит считай бесплатно. А x.FirstOrDefault() в сравнении с этим неимоверно дорог.

I>Например, когда эта операция одна из основных в экспоненциальном алгоритме, любая издержка дает конское отставание.

Я уже приводил тебе на замеры производительности. Прочитай еще раз
https://mattwarren.org/2016/09/29/Optimising-LINQ/

есть простейший запрос и оптимизаторы
var results = items.Where(i => i % 10 == 0)
                   .Select(i => i + 5);


Первый твой любимый List

IEnumerable<int> LinqOptimizer(int [] input)
{
    var collector = new Nessos.LinqOptimizer.Core.ArrayCollector<int>();
    for (int counter = 0; counter < input.Length; counter++)
    {
        var i = input[counter];
        if (i % 10 == 0)
        {
            var result = i + 5;
            collector.Add(result);
        }
    }
    return collector;
}


Второй с использованием yield

IEnumerable<int> RoslynLinqRewriteWhereSelect_ProceduralLinq1(int[] _linqitems)
{
    if (_linqitems == null)
        throw new System.ArgumentNullException();
    for (int _index = 0; _index < _linqitems.Length; _index++)
    {
        var _linqitem = _linqitems[_index];
        if (_linqitem % 10 == 0)
        {
            var _linqitem1 = _linqitem + 5;
            yield return _linqitem1;
        }
    }
}


все это замеряется через
items.Where(i => i % 10 == 0)
     .Count();


Итеративно 3 удава
Linq 4.88
Roslyn 3.87
LinqOptimiser 5.03

То есть твои доводы про производительнсть yield идут лесом.
Выделение памяти намного дороже. Он умудрился проиграть даже родному Linq.
Re[37]: Есть ли подобие LINQ на других языках/платформах?
Здравствуйте, Ikemefula, Вы писали:


I>Именно. x[0] инлайнится враз и стоит считай бесплатно. А x.FirstOrDefault() в сравнении с этим неимоверно дорог.

I>Например, когда эта операция одна из основных в экспоненциальном алгоритме, любая издержка дает конское отставание.

Я уже приводил тебе на замеры производительности. Прочитай еще раз
https://mattwarren.org/2016/09/29/Optimising-LINQ/

есть простейший запрос и оптимизаторы
var results = items.Where(i => i % 10 == 0)
                   .Select(i => i + 5);


Первый твой любимый List

IEnumerable<int> LinqOptimizer(int [] input)
{
    var collector = new Nessos.LinqOptimizer.Core.ArrayCollector<int>();
    for (int counter = 0; counter < input.Length; counter++)
    {
        var i = input[counter];
        if (i % 10 == 0)
        {
            var result = i + 5;
            collector.Add(result);
        }
    }
    return collector;
}


Второй с использованием yield

IEnumerable<int> RoslynLinqRewriteWhereSelect_ProceduralLinq1(int[] _linqitems)
{
    if (_linqitems == null)
        throw new System.ArgumentNullException();
    for (int _index = 0; _index < _linqitems.Length; _index++)
    {
        var _linqitem = _linqitems[_index];
        if (_linqitem % 10 == 0)
        {
            var _linqitem1 = _linqitem + 5;
            yield return _linqitem1;
        }
    }
}




Итеративно 3 удава
Linq 4.88
Roslyn 3.87
LinqOptimiser 5.03

То есть твои доводы про производительность yield идут лесом.
Выделение памяти намного дороже. Он умудрился проиграть даже родному Linq.