Каковы Эффективность и Производительность LINQ и Лямбда-выражения в .NET?

http://code.google.com/p/javascript-number-formatter/ :

  • Короткий, быстрый, гибкий, но автономный. Всего 75 строк, включая информацию о лицензии MIT, пустые строки и комментарии.
  • Принять стандартное форматирование чисел, например #, ## 0,00 или с отрицанием -000. ####.
  • Примите любой формат страны, например # ## 0,00, #, ###. ##, # '###. ## или любой тип не нумерованного символа.
  • Принимайте любые цифры группировки цифр. #, ##, # 0.000 или #, ### 0. ## все действительны.
  • Примите любое избыточное / надежное форматирование. ##, ###, ##. # или 0 #, # 00 #. ### 0 # все в порядке.
  • Автоматическое округление чисел.
  • Простой интерфейс, просто поставьте маску и усилитель; значение как это: формат ("0,0000", 3.141592)

ОБНОВЛЕНИЕ Это мои доморощенные pp утилиты для наиболее распространенных задач:

var NumUtil = {};

/**
  Petty print 'num' wth exactly 'signif' digits.
  pp(123.45, 2) == "120"
  pp(0.012343, 3) == "0.0123"
  pp(1.2, 3) == "1.20"
*/
NumUtil.pp = function(num, signif) {
    if (typeof(num) !== "number")
        throw 'NumUtil.pp: num is not a number!';
    if (isNaN(num))
        throw 'NumUtil.pp: num is NaN!';
    if (num < 1e-15 || num > 1e15)
        return num;
    var r = Math.log(num)/Math.LN10;
    var dot = Math.floor(r) - (signif-1);
    r = r - Math.floor(r) + (signif-1);
    r = Math.round(Math.exp(r * Math.LN10)).toString();
    if (dot >= 0) {
        for (; dot > 0; dot -= 1)
            r += "0";
        return r;
    } else if (-dot >= r.length) {
        var p = "0.";
        for (; -dot > r.length; dot += 1) {
            p += "0";
        }
        return p+r;
    } else {
        return r.substring(0, r.length + dot) + "." + r.substring(r.length + dot);
    }
}

/** Append leading zeros up to 2 digits. */
NumUtil.align2 = function(v) {
    if (v < 10)
        return "0"+v;
    return ""+v;
}
/** Append leading zeros up to 3 digits. */
NumUtil.align3 = function(v) {
    if (v < 10)
        return "00"+v;
    else if (v < 100)
        return "0"+v;
    return ""+v;
}

NumUtil.integer = {};

/** Round to integer and group by 3 digits. */
NumUtil.integer.pp = function(num) {
    if (typeof(num) !== "number") {
        console.log("%s", new Error().stack);
        throw 'NumUtil.integer.pp: num is not a number!';
    }
    if (isNaN(num))
        throw 'NumUtil.integer.pp: num is NaN!';
    if (num > 1e15)
        return num;
    if (num < 0)
        throw 'Negative num!';
    num = Math.round(num);
    var group = num % 1000;
    var integ = Math.floor(num / 1000);
    if (integ === 0) {
        return group;
    }
    num = NumUtil.align3(group);
    while (true) {
        group = integ % 1000;
        integ = Math.floor(integ / 1000);
        if (integ === 0)
            return group + " " + num;
        num = NumUtil.align3(group) + " " + num;
    }
    return num;
}

NumUtil.currency = {};

/** Round to coins and group by 3 digits. */
NumUtil.currency.pp = function(amount) {
    if (typeof(amount) !== "number")
        throw 'NumUtil.currency.pp: amount is not a number!';
    if (isNaN(amount))
        throw 'NumUtil.currency.pp: amount is NaN!';
    if (amount > 1e15)
        return amount;
    if (amount < 0)
        throw 'Negative amount!';
    if (amount < 1e-2)
        return 0;
    var v = Math.round(amount*100);
    var integ = Math.floor(v / 100);
    var frac = NumUtil.align2(v % 100);
    var group = integ % 1000;
    integ = Math.floor(integ / 1000);
    if (integ === 0) {
        return group + "." + frac;
    }
    amount = NumUtil.align3(group);
    while (true) {
        group = integ % 1000;
        integ = Math.floor(integ / 1000);
        if (integ === 0)
            return group + " " + amount + "." + frac;
        amount = NumUtil.align3(group) + " " + amount;
    }
    return amount;
}

38
задан Community 23 May 2017 в 12:26
поделиться

5 ответов

There's no one single answer that will suffice here.

LINQ has many uses, and many implementations, and thus many implications to the efficiency of your code.

As with every piece of technology at our fingertips, LINQ can and will be abused and misused alike, and the ability to distinguish between that, and proper usage, is only dependent on one thing: knowledge.

So the best advice I can give you is to go and read up on how LINQ is really implemented.

Things you should check into are:

And as always, when looking at efficiency questions, the only safe approach is just to measure. Create a piece of code using LINQ that does a single, know, thing, and create an alternative, then measure both, and try to improve. Guessing and assuming will only lead to bad results.

33
ответ дан 27 November 2019 в 03:48
поделиться

Технически самый быстрый способ - контролировать все мелочи самостоятельно. Вот несколько тестов производительности . Обратите внимание, что ключевое слово foreach и конструкция ForEach LINQ одинаково намного медленнее, чем просто использование for и написание процедурного кода.

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

6
ответ дан 27 November 2019 в 03:48
поделиться

For LINQ queries, with the 'new syntax', the IL (code) generated, is fundamentally no different than calling the extension methods provided by Enumerable and Queryable directly.

5
ответ дан 27 November 2019 в 03:48
поделиться

Не оптимизируйте преждевременно. Широко используйте Linq и новые методы расширения, если они улучшают читаемость и впоследствии профилируют ваше приложение.

В большинстве случаев разница между Linq и использованием простых циклов for вообще не актуальна. Повышенная ремонтопригодность вашего кода должна стоить несколько мс. Linq can be slower because it works on enumerators which are implemented as state machines. So plain for(...) loops will be faster.

I would recommend following Lasse V. Karlsens advice and append http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html to his link list.

3
ответ дан 27 November 2019 в 03:48
поделиться

В некоторых случаях LINQ работает так же быстро, если не быстрее, чем другие методы, но в других случаях он может быть медленнее. Мы работаем над проектом, который преобразовали в linq, и поиск данных выполняется быстрее, но объединение данных между двумя таблицами происходит намного медленнее. Есть небольшие накладные расходы, но в большинстве случаев я не вижу, чтобы разница в скорости сильно влияла на вашу программу.

2
ответ дан 27 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: