Бенчмаркая пагинацию: Where перед Skip — и метод в 1323 раза медленнее
Geronom 17 минут назад Бенчмаркая пагинацию: Where перед Skip — и метод в 1323 раза медленнее Средний 6 мин 695 C# * .NET * Программирование * Аналитика Уважаемые читатели, в этой статье я хочу рассказать о том,...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: Geronom 17 минут назад Бенчмаркая пагинацию: Where перед Skip — и метод в 1323 раза медленнее Средний 6 мин 695 C# * . NET * Программирование * Аналитика Уважаемые читатели, в этой статье я хочу рассказать о том, насколько медленнее работает метод, если Where стоит перед Skip — и представить свои выводы. В большинстве проектов пагинацию делают через Skip и Take.
Пока перед Skip нет Where, LINQ берёт элемент по индексу. С Where — перебирает все пропускаемые, и так на каждой странице. Сравниваются семь способов:Array_Where_Select — Where и Select, потом Skip и Take;Array_Where_NoSelect — то же самое без Select;Array_Take_Then_Where — Skip и Take перед Where;Range_Select и List_Select — без Where;Range_ToArray — ToArray один раз, дальше страницы по индексу;Array_ByIndex — то же самое без LINQ.
Технические детали
Будет 3 истории:во сколько раз Where перед Skip замедляет метод;одна страница: как её номер влияет на время;три способа решить проблему и настройка, которая делает только хуже. Замеры сделаны на четырёх машинах:№CPUЯдра/потокиЧастотаОС№1AMD Ryzen 9 5950X16 / 323,4 ГГц, до 4,9 в турбоWindows 10 1809№2Intel Core i9-10900KF10 / 203,7 ГГц, до 5,3 в турбоWindows 10 22H2№32 × Intel Xeon Silver 43142×16 / 642,4 ГГц, до 3,4 в турбоWindows Server 2022№4Intel Xeon W-225510 / 203,7 ГГц, до 4,5 в турбоWindows Server 2022BenchmarkDotNet 0. Патч-версии рантаймов на машинах различаются, поэтому сравнивать имеет смысл столбцы внутри одной машины.
Where перед SkipМассив из 157 000 элементов, страница — 157 элементов, всего 1000 страниц. Каждая страница попадает в отдельный массив, значения складываются:// SizeOptLinqProof, Subjects. cs public static long PagesFromWhere(int data) { IEnumerable source = data.
Where(static x => x >= 0). Select(Value); long sum = 0; int pages = PageCount(data. Length); for (int page = 0; page < pages; page++) { int block = source.
Отраслевые последствия
Skip(page * PageSize). ToArray(); for (int i = 0; i < block. Length; i++) { sum += block; } } return sum; }Where написан так, что не отбрасывает ни одного элемента: все семь способов возвращают одну и ту же сумму.
Перед каждым прогоном это проверяет отчёт checks. Способ№1 Ryzen№2 i9№3 2×Xeon Silver№4 Xeon WArray_Where_Select172,068171,961252,846259,505Array_Where_NoSelect226,298204,699329,007437,143Array_Take_Then_Where0,6540,6081,0471,006Range_Select0,5450,3610,6150,612List_Select0,4150,3740,6360,639Range_ToArray0,4520,3990,6890,619Array_ByIndex0,1570,1300,2470,200Миллисекунды на 157 000 элементов и 1000 страниц, . NET 10: с Where перед Skip медленнее в 1024–1323 раза, чем по индексуМедленнее в 1096 раз на Ryzen 5950X, в 1323 на i9-10900KF, в 1024 на 2 × Xeon Silver 4314, в 1298 на Xeon W-2255.
Без него остаются те же три порядка: 1332–2186 раз против работы по индексу. Остальные способы уложились в 0,130–1,047 миллисекунды.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






