Бенчмаркая LINQ: подстава с OrderBy — одно условие и полная сортировка
Geronom 23 минуты назад Бенчмаркая LINQ: подстава с OrderBy — одно условие и полная сортировка Средний 8 мин 570 C# * .NET * Программирование * Аналитика В этой статье я хочу рассказать, какие вызовы после OrderBy...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. Geronom 23 минуты назад Бенчмаркая LINQ: подстава с OrderBy — одно условие и полная сортировка Средний 8 мин 570 C# * . NET * Программирование * Аналитика В этой статье я хочу рассказать, какие вызовы после OrderBy проходят набор один раз, а какие приводят к полной сортировке. Ни по коду, ни по ответу разницу не увидеть: запись почти одинаковая, ответ везде верный.
Считаются не секунды, а обращения к компаратору и к селектору ключа. По ним всё видно сразу: один проход по тысяче элементов — 999 сравнений, полная сортировка того же набора — 11 081. Счётчики одинаковы на любой машине, поэтому выводы сделаны по ним, а время идёт как дополнение.
Технические детали
Замерялись такие вызовы:12 способов получить результат: First, Last, те же два с условием, FirstOrDefault с условием, Min, Max, ElementAt по трём позициям, Take и ToArray7 операторов, поставленных между OrderBy и First: ThenBy, OrderByDescending, Select, Distinct, Take, Skip, Reverse4 записи одной задачи: найти наименьший элемент среди тех, что проходят условиевсё то же самое, но элемент не число, а класс с ключом в свойствеБудет 3 истории:как один аргумент в First меняет способ вычисления, и почему с Last этого не происходит;какие операторы между OrderBy и First оставляют один проход, а какие приводят к полной сортировке;что изменилось в . МашинаПроцессорСистемаКомп 1Intel Core i9-10900KF 3. 70GHz, 10 ядерWindows 10 22H2Комп 2AMD Ryzen 9 5950X 3.
39GHz, 16 ядерWindows 10 1809Комп 3Intel Xeon W-2255 3. 70GHz, 10 ядерWindows Server 2022Комп 4Intel Xeon Silver 4314 2. 40GHz, 2 CPU, 32 ядраWindows Server 2022Рантаймы: 8.
8, все четыре рантайма одним прогоном. NET 11 — предварительная сборка. С новой версией числа могут измениться.
Отраслевые последствия
Один аргумент меняет способ вычисленияДве строки ниже различаются одним аргументом. Обе дают верный ответ. // один проход по набору, сортировки нет int lowest = numbers.
First(); // полная сортировка всего набора int lowest = numbers. First(x => x >= threshold);По времени вывода не сделать. Поэтому считаются обращения к компаратору: он передаётся в OrderBy обычным аргументом и считает собственные вызовы.
public sealed class CountingComparer : IComparer { public static readonly CountingComparer Instance = new(); public int Compare(int x, int y) { CallCounter. CountComparison(); return x. CompareTo(y); } }Найти наименьший или наибольший элемент за один проход по тысяче чисел — это 999 сравнений.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





