Найти тему
Кодовые Мемуары

Обзор: новые возможности .NET 8

Ну что там, в новом .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:

-2

Шаблон консольного приложения по умолчанию теперь включает поддержку 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! ❤️