Ну что там, в новом .NET 8? Собрались начинать переносить проекты на эту новенькую версию? Давай рассмотрим, что тут у нас появилось: улучшение работы с контейнерами, прокаченная работы с json, фишки для улучшения производительности, Native AOT, даже GC не обошли стороной, да и новые типы, прицеленные на повышение скорости работы проектов, да и про безопасность не забыли! Эх, давай разбираться, что и где.
Улучшение производительности
Microsoft заявляет, что .NET 7 быстр, а .NET 8 - еще быстрее. Пафосно, да? Stephen Toub в своем стиле рассказывает про улучшения скорости в .NET 8. Кажется, вся их статья об улучшениях скорости – это как книга на сотни страниц! Ну, или почти. Там JIT, GC, рефлексия, коллекции, LINQ, кодогенерация, сериализация, десериализация... и прочее, и прочее. Заходи, почитай, найдешь что-то интересное, не сомневаюсь!
Кратко про улучшения:
1) Включает в себя улучшения в генерации кода и компиляции just-in time (JIT):
- Улучшения производительности Arm64
- Улучшили дела SIMD
- Поддержка расширений AVX-512 ISA (см. Vector512 и AVX-512)
- Еще и облачные улучшения прикрутили
- Улучшение пропускной способности JIT
- Цикл и общие оптимизации
- Оптимизированный доступ к полям, отмеченным ThreadStaticAttribute
- Последовательное распределение реестра. Arm64 имеет две инструкции для поиска вектора таблицы, которые требуют, чтобы все сущности в их операндах кортежей присутствовали в последовательных регистрах.
- Теперь JIT/NativeAOT автоматом векторизирует некоторые манипуляции с памятью при помощи SIMD: типа сравнивает, копирует и обнуляет, если он ухватит размеры во время компиляции.
2) А еще вот, они динамическую оптимизацию под управлением профиля (PGO) подкрутили и теперь по умолчанию включили. Больше не надо ломать голову, включать эту опцию в конфигурации во время выполнения. Она сама теперь шибко работает, и с многоуровневой компиляцией дружит.
В среднем динамический PGO повышает производительность примерно на 15%. В эталонном наборе из ~4600 тестов 23% увидели улучшение производительности на 20% или более.
Встроенная поддержка AOT
Тут тоже кое-что появилось. Поддержка архитектур x64 и arm64 на macOS – вот это да! Приложения стали легче и веселее, особенно для Linux, размер уже на половину уменьшили, ну и немного поработали над iOS-подобными платформами. Но тут рановато радоваться, только начало работы, говорят, не делайте поспешных выводов о производительности.
В следующей таблице показан размер приложения "Hello World", опубликованного с помощью Native AOT. Время выполнения на .NET 7 против .NET 8:
Шаблон консольного приложения по умолчанию теперь включает поддержку AOT из коробки. Чтобы создать проект, настроенный для компиляции AOT, просто запустите dotnet new console --aot.
Новые типы данных
Новое пространство имен System.Collections.Frozen включает в себя новые приблуды:
FrozenDictionary<TKey, TValue>, FrozenSet<T> - теперь у нас есть неизменяемые коллекции, специально для чтения. Пригодятся, если что-то долго хранить надо.
Еще там SearchValues<T>, CompositeFormat, XxHash3 и XxHash128 - своего рода новые игрушки для разработчиков.
Аудит безопасности NuGet
Ну, безопасность важна, да? Теперь при выполнении команд dotnet add и dotnet restore будешь получать предупреждения о пакетах с уязвимостями.
Новые возможности Random
Новые методы для работы со случайностью - не помешают, особенно в мире машинного обучения. Там что-то с выборкой элементов и перемешиванием:
1. Новые методы Random.Shuffle и RandomNumberGenerator.Shuffle<T>(Span<T>) позволяют перемешать переданную последовательность элементов.
2. Метод GetItems тут появился, помогает вытаскивать случайные элементы из переданной коллекции.
Разработчики говорят, что такие штучки в мире машинного обучения в спросе.
Сборка мусора
Теперь можно регулировать ограничения памяти. Можно установить предел для размера кучи на лету – вот так, по приколу.
Полезно для облачных сервисов, где спрос взлетает и падает, как на горках. Чтобы быть экономически эффективными, сервис должен уметь подстраиваться под колебания спроса - когда он падает, он снижает потребление ресурсов, когда растет - расширяет. Раньше это было сложно, потому что наш GC не знал, что да как, и выделял больше памяти, чем было нужно. А теперь - бац! С этим обновлением можно вызвать APIRefreshMemoryLimit() и подогнать GC под новые лимиты памяти. Вот так, просто и легко:
Улучшения System.Text.Json
Пожалуй, приведу самые важные изменения из статьи:
- Библиотека System.Text.Json делает шикарные штуки с JSON. С ней сериализация и десериализация - происходят быстрее, да и память не жрет.
- Значительно улучшена поддержка работы с библиотекой в приложениях Native AOT, которые компилируются в машинный код без использования среды исполнения.
- Добавлена возможность настраивать поведение сериализатора для разных типов данных с помощью атрибутов. Там вот такие настройки можно подкрутить: сказать, какие части класса обязательны, как лучше обрабатывать непонятные кусочки JSON, да и с интерфейсами разбирается теперь.
- Ну и API прикольные добавили для работы с JSON-документами и JSON-указателями, которые позволяют манипулировать JSON-данными на низком уровне, например, добавлять, удалять или изменять элементы JSON.
- Были добавлены новые политики именования для JSON, такие как snake case и kebab case, которые преобразуют имена свойств в соответствии с определенными правилами.
- Исправили глюки, которые портили сериализацию или десериализацию. Ну, понимаешь, чтобы было без косяков и лишних нервов.
Пару слов о контейнерах
Парни из Microsoft замутили там дела с контейнерами - Docker, Kubernetes и прочие такие. Теперь у них новые API для определения и управления конфигурацией контейнеров, а также упрощение процесса сборки и развертывания контейнеризованных приложений. Не зря, знаешь ли, работают, чтобы было нам, пользователям, легче.
Заключение
В общем, кажется, в .NET 8 много всего интересного! Ну, или почти много. Что скажешь, уже что-то используешь из этой красоты? Делись в комментариях и подписывайся на канал, чтобы не пропустить новые выпуски новостей и обзоров из мира IT! ❤️