
Бенчмаркая foreach и энумераторы: аллокации, которые прятались 10 лет
Geronom 13 минут назад Бенчмаркая foreach и энумераторы: аллокации, которые прятались 10 лет Простой 17 мин 237 .NET * C# * Программирование * Уважаемые читатели, в этой статье я хочу рассказать о скрытых аллокациях в...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: Geronom 13 минут назад Бенчмаркая foreach и энумераторы: аллокации, которые прятались 10 лет Простой 17 мин 237 . NET * C# * Программирование * Уважаемые читатели, в этой статье я хочу рассказать о скрытых аллокациях в обычном foreach и представить свои выводы. net 10 одновременно, чтобы было видно, как одна и та же строчка кода ведет себя на разных рантаймах.
Все тесты сделаны с использованием BenchmarkDotNet, полный код представлен на гите, так что каждый может проверить результаты и сделать свои выводы. Будет три истории, и все три про foreach:SortedList из стандартной библиотеки аллоцирует память на каждый foreach, а Dictionary — нет. Из-за одной строчки в сигнатуре метода.
Технические детали
И починить это по-нормальному нельзя.. NET 10 научился убирать такие аллокации вообще без изменения вашего кода. И по пути выяснилось, что одна старая оптимизация мешала новой.
У новой оптимизации есть задокументированная самим Microsoft граница — на больших коллекциях она может срываться. Я пошел ловить этот обрыв с бенчмарком — и получилось интереснее, чем я ожидал. Аллокации на один foreach: .
NET 10 (одинаково на всех четырех машинах)Каждое утверждение подкреплено ссылкой на GitHub dotnet/runtime или на официальный блог . NET — специально собрал пруфы, чтобы можно было пойти и проверить первоисточник, а не верить мне на слово. Все ссылки продублированы списком в конце.
Отраслевые последствия
Тесты гонялись на четырех машинах — от игровых десктопов до двухпроцессорных серверов:МашинаCPUОС. NET 10 / 9 / 8№1AMD Ryzen 9 5950X, 16 ядерWindows 1010. 14№2Intel Core i9-10900KF, 10 ядерWindows 1010.
28№32 x Intel Xeon Silver 4314, 32 ядраWindows Server 202210. 16№42 x Intel Xeon Silver 4314, 32 ядраWindows Server 202210. 16BenchmarkDotNet везде v0.
Подробные таблицы по ходу статьи — с машины №2, по остальным привожу сводные сравнения. Обратите внимание на версии . 9 — три разные сервисные сборки, это еще сыграет роль в третьей истории.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





