OrderBy(). Last() или OrderByDescending(). Первая() производительность
Я знаю, что это, вероятно, микро-оптимизация, но все же мне интересно, есть ли разница в использовании
var lastObject = myList.OrderBy(item => item.Created).Last();
или
var lastObject = myList.OrderByDescending(item => item.Created).First();
Я ищу ответы для Linq для объектов и Linq для Entities.
Ответы
Ответ 1
Предполагая, что оба способа сортировки принимают равное время (и что большой "если" ), тогда первый метод будет иметь дополнительные затраты на выполнение .Last()
, потенциально требуя полного перечисления.
И этот аргумент, вероятно, еще сильнее подходит для LINQ, ориентированного на SQL.
Ответ 2
(мой ответ о Linq для объектов, а не Linq для объектов)
Я не думаю, что существует большая разница между двумя инструкциями, это, очевидно, случай микро-оптимизации. В обоих случаях сбор нужно сортировать, что обычно означает сложность O(n log n)
. Но вы можете легко получить тот же результат со сложностью O(n)
, перечислив сбор и отслеживая минимальное или максимальное значение. Jon Skeet обеспечивает реализацию в своем проекте MoreLinq в виде метода расширения MaxBy
:
var lastObject = myList.MaxBy(item => item.Created);
Ответ 3
В обоих случаях это зависит от ваших базовых коллекций. Если у вас есть знания о том, как коллекции выглядят перед заказом, и вы можете выбрать один из них. Например, если вы знаете, что список обычно в порядке возрастания (или в основном по возрастанию), вы можете предпочесть первый выбор. Или, если вы знаете, что у вас есть индексы в таблицах SQL, отсортированные по возрастанию. Хотя оптимизатор SQL может, вероятно, справиться с этим.
В общем случае они являются эквивалентными утверждениями. Вы были правы, когда сказали, что это микро-оптимизация.
Ответ 4
Мне жаль, что это прямо не отвечает на ваш вопрос, но...
Почему бы не сделать лучшую оптимизацию и не использовать реализации Jon Skeet MaxBy или MinBy?
Это будет O (n) в отличие от O (n log n) в обеих альтернативах, которые вы представили.
Ответ 5
Предполагая, что OrderBy и OrderByDescending в среднем имеют ту же производительность, первый элемент будет лучше, чем последний, когда число элементов велико.
Ответ 6
просто мои два цента: поскольку OrderBy
или OrderByDescending
должны все равно перебирать все объекты, не должно быть разницы. однако, если бы это был я, я бы, вероятно, просто пропустил все элементы в foreach
, чтобы сравнить верхний элемент сравнения, который был бы поиском O (n), а не любым порядком сортировки.