
Бенчмаркая регресс LINQ: обещали −19%, на четырёх машинах намерил +31%
Geronom 9 минут назад Бенчмаркая регресс LINQ: обещали −19%, на четырёх машинах намерил +31% Средний 5 мин 64 C# * .NET * Программирование * Аналитика Уважаемые читатели, в этой статье я хочу рассказать о проверке...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: Geronom 9 минут назад Бенчмаркая регресс LINQ: обещали −19%, на четырёх машинах намерил +31% Средний 5 мин 64 C# * . NET * Программирование * Аналитика Уважаемые читатели, в этой статье я хочу рассказать о проверке обещанного регресса LINQ в . NET 10 — и представить свои выводы.
В dotnet/runtime с лета висит issue #117717: после перехода на . NET 10 метод с First(предикат) просел к девятке — у автора issue на Intel 13-го поколения до 19%, у Энди Эйерса из JIT-команды на Zen 4 порядка 10%. Причину команда назвала сама: связка PGO и инлайнинга, делегат предиката перестал инлайниться.
Технические детали
Решение тоже озвучили: в десятке чинить не будем — сломаем другое, переносим в . Был частичный фикс (PR #117816), после которого issue переоткрыли как #119425. Десятка при этом LTS, и в комментах закономерный вопрос: обновляться на десятку или ждать одиннадцатую.
Будет 3 истории:регресс, который не пришёл — First(предикат) на четырёх машинах: вместо обещанных −19% вышло +25–32%, и LINQ-вариант обогнал даже обычный for;тот самый OSR-сценарий — длинный цикл из issue, . NET 11 preview и дизасм, где мой предикат заинлайнен прямо в тело библиотечного метода;откуда ускорение в десять раз при переходе с восьмёрки на девятку — и просадка того же рода, что в issue, только на Count и на другом железе. Весь код проверки — в репо LinqFirstProof.
Машины те же, что в статье про Sum:№CPUЯдра/потокиЧастота. NET 10№1AMD Ryzen 9 5950X16 / 323,4 ГГц базовых и до 4,9 в турбо9. 5№2Intel Core i9-10900KF10 / 203,7 ГГц базовых и до 5,3 в турбо9.
Отраслевые последствия
10№32 × Intel Xeon Silver 4314 (Ice Lake)2×16 / 642,4 ГГц базовых и до 3,4 в турбо9. 1№4Intel Xeon W-2255 (Cascade Lake)10 / 203,7 ГГц базовых и до 4,5 в турбо9. Регресс, который не пришёлПовторяю сценарий из issue в минимальном виде: List из 1000 объектов с полями X и Y, искомый элемент лежит последним и его пара значений уникальна — First обязан пройти весь список.
Лямбда захватывает обе цели, компилятор делает display class и делегат — ровно тот, который по issue перестал инлайниться. Рядом для сравнения: тот же поиск своим for и foreach, кэшированный делегат без захвата, Count с предикатом и Sum() без делегата как контроль из прошлой статьи. Результат по главному методу: регресс до моего железа не доехал.
Наоборот:First(предикат): . NET 10 быстрее девятки на 25–32% на всех четырёх машинахПолная картина по методам на машине №2:Все методы: замыкание, кэшированный делегат, свои циклы, Count и контрольный Sum()Из таблицы — три факта. First_Linq на десятке (349,4 нс) обогнал First_For (445,6 нс), и так на всех четырёх машинах — разрыв от 14 до 40%.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




