Я могу отсортировать список с помощью Sort или OrderBy. Какой из них быстрее? Оба работают по одному и тому же алгоритму?
List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));
1.
persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));
2.
var query = persons.OrderBy(n => n.Name, new NameComparer());
class NameComparer : IComparer<string>
{
public int Compare(string x,string y)
{
return string.Compare(x, y, true);
}
}
c#
.net
performance
sorting
sql-order-by
user215675
источник
источник
Ответы:
Почему бы не измерить:
На моем компьютере при компиляции в режиме выпуска эта программа печатает:
ОБНОВИТЬ:
Как предложил @Stefan, вот результаты сортировки большого списка меньшее количество раз:
Печать:
В этом сценарии похоже, что OrderBy работает лучше.
ОБНОВЛЕНИЕ2:
И используя случайные имена:
Куда:
Урожайность:
Все еще OrderBy быстрее
источник
LINQ
приходится тратить дополнительную память по сравнению с реализацией на местеList<T>.Sort
. Я не уверен, улучшили ли они это в более новых версиях .NET, но на моей машине (i7 третьего поколения 64-битная версия .NET 4.5)Sort
превосходитOrderBy
во всех случаях. Кроме того, глядя наOrderedEnumerable<T>
исходный код, кажется, что он создает три дополнительных массива (сначала aBuffer<T>
, затем массив спроецированных ключей, затем массив индексов), прежде чем, наконец, вызвать Quicksort для сортировки массива индексов на месте.ToArray
вызов, который создает результирующий массив. Операции с памятью и индексация массивов - невероятно быстрые операции, но я все еще не могу найти логику этих результатов.Нет, это разные алгоритмы. Для начала, LINQ
OrderBy
задокументирован как стабильный (т. Е. Если два элемента имеют одинаковые значенияName
, они будут отображаться в исходном порядке).Это также зависит от того, буферизуете ли вы запрос или повторяете его несколько раз (LINQ-to-Objects, если вы не буферизуете результат, будет переупорядочен для каждого
foreach
).Для
OrderBy
запроса я также хотел бы использовать:(для
{yourchoice}
одного изCurrentCulture
,Ordinal
илиInvariantCulture
).List<T>.Sort
Enumerable.OrderBy
источник
Enumerable.OrderBy
и детализации его внутренней реализации, вы можете увидеть, что алгоритм сортировки OrderBy - это вариант QuickSort, который выполняет стабильную сортировку. (СмSystem.Linq.EnumerableSorter<TElement>
.) Таким образом,Array.Sort
иEnumerable.OrderBy
оба могут иметь время выполнения O (N log N) , где N - количество элементов в коллекции.Ответ Дарина Димитрова показывает, что
OrderBy
это немного быстрее, чемList.Sort
при работе с уже отсортированным вводом. Я изменил его код, так что он неоднократно сортирует несортированные данные иOrderBy
в большинстве случаев работает немного медленнее.Кроме того,
OrderBy
тест используетToArray
для принудительного перечисления перечислителя Linq, но он, очевидно, возвращает тип (Person[]
), который отличается от входного типа (List<Person>
). Поэтому я повторно запустил тест, используяToList
вместо,ToArray
и получил еще большую разницу:Код:
источник
OrderByWithToList
занимает то же время, что иOrderBy
.Думаю, важно отметить еще одно различие между
Sort
иOrderBy
:Предположим, существует
Person.CalculateSalary()
метод, который требует много времени; возможно, больше, чем даже операция по сортировке большого списка.Сравнить
Вариант 2 может иметь превосходную производительность, поскольку он вызывает
CalculateSalary
метод только n раз, тогда какSort
опция может вызыватьCalculateSalary
до 2 n log ( n ) раз, в зависимости от успеха алгоритма сортировки.источник
n
times. Очевидно, что это не так удобно, как использование OrderBy.В двух словах :
Список / Сортировка массива ():
OrderBy / ThenBy ():
x => x.Id
. Все ключи извлекаются перед сортировкой. Это может привести к более высокой производительности, чем использование Sort () и настраиваемого компаратора.Источники: MDSN , справочный источник и репозиторий dotnet / coreclr (GitHub).
Некоторые из перечисленных выше утверждений основаны на текущей реализации платформы .NET (4.7.2). Это может измениться в будущем.
источник
следует рассчитать сложность алгоритмов, используемых методами OrderBy и Sort. Насколько я помню, QuickSort имеет сложность n (log n), где n - длина массива.
Я тоже искал orderby, но не смог найти никакой информации даже в библиотеке msdn. если у вас нет одинаковых значений и сортировки, относящейся только к одному свойству, я предпочитаю использовать метод Sort (); если нет, то используйте OrderBy.
источник
Я просто хочу добавить, что orderby намного полезнее.
Зачем? Потому что я могу это сделать:
Почему сложный компаратор? Просто отсортируйте по полю. Здесь я сортирую по TotalBalance.
Очень просто.
Я не могу этого сделать с сортировкой. Интересно, почему. Ладно с orderBy.
Что касается скорости, это всегда O (n).
источник