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), а не любым порядком сортировки.