.NET 7
Это заготовка статьи. |
.NET 7 —
Нововведения .NET 7
Обзор нововведений .NET 7[1].
Native AOT
AOT (ahead-of-time) – компиляция приложения не в промежуточный, а сразу в машинный код. Native AOT использует ahead of time компилятор для компиляции IL в машинный код во время публикации self-contained[2] приложения. Native AOT был переведён из статуса экспериментального. Основными преимуществами native AOT приложений являются:
- время запуска;
- использование памяти;
- работа на платформах с ограничениями (JIT недоступен).
Native AOT приложения имеют ряд ограничений:
- нет динамической загрузки (например, Assembly.LoadFile);
- нет генерации кода во время выполнения (например, System.Reflection.Emit);
- нет C++/CLI;
- и т. д.
On Stack Replacement (OSR)
OSR[3] позволяет заменять машинный код, который выполняется в данный момент, на новый — более оптимизированный. Ранее такая возможность была только между вызовами метода. Подобный подход позволяет применять многоуровневую компиляцию ко всем методам. Благодаря этому можно добиться более быстрой компиляции и при этом стабильной производительности. Судя по тестам Microsoft, внедрение данной технологии помогло на 25 % ускорить запуск нагруженных приложений. OSR в .NET 7 включена по умолчанию для x64 и Arm64.
Централизованное управление пакетами (CPM)
Управление зависимостями для многопроектных решений может оказаться сложной задачкой. Теперь же в ситуациях, когда требуется управление общими зависимостями для нескольких проектов, вы можете использовать централизованное управление NuGet пакетами[4]. Для централизованного управления зависимостями потребуется добавить файл Directory.Packages.props в корень решения. Благодаря CPM версия пакета указывается только в Directory.Packages.props, а в проектах требуется лишь сослаться на пакет.
GC Regions
Регионы GC – это функция, которая разрабатывается уже несколько лет. Если раньше приходилось иметь несколько больших сегментов памяти (например, 1 ГБ), то теперь GC поддерживает множество маленьких областей (например, 4 МБ). Это позволяет GC быть более гибким в вопросах перепрофилирования областей памяти из одного поколения в другое.
В .NET 7 регионы используются по умолчанию для 64-битных приложений. Подробности по данному вопросу можно получить из статьи архитектора .NET GC: [5].
Rate Limiting
Rate limiting – это механизм ограничения объёма доступа к ресурсу. Таким образом можно задать определённый лимит доступа, например, к базе данных.
Для написания ограничителя в .NET 7 был добавлен NuGet пакет System.Threading.RateLimiting. В основном работа будет происходить с абстрактным классом RateLimiter. Один из примеров работы от Microsoft:
RateLimiter limiter = GetLimiter();
using RateLimitLease lease = limiter.Acquire(permitCount: 1);
if (lease.IsAcquired)
{
// Do action that is protected by limiter
}
else
{
// Error handling or add retry logic
}
В примере выше мы пытаемся получить 1 разрешение с помощью метода Acquire. Далее идёт проверка – было ли получено разрешение:
- если разрешение было получено, то можем использовать ресурс;
- если разрешение не было получено, то это можно залогировать или обработать как ошибку.
Примечания
- ↑ Что нового в .NET 7? Хабрахабр (16 ноября 2022). Дата обращения: 16 ноября 2022. Архивировано 16 ноября 2022 года.
- ↑ .NET application publishing overview (англ.). Microsoft Learn (8 апреля 2022). Дата обращения: 16 ноября 2022. Архивировано 27 октября 2022 года.
- ↑ Performance Improvements in .NET 7 - On-Stack Replacement (англ.). Microsoft .NET Blog (31 августа 2022). Дата обращения: 10 ноября 2022. Архивировано 10 ноября 2022 года.
- ↑ Central Package Management (CPM) (англ.). Microsoft Learn (11 августа 2022). Дата обращения: 17 ноября 2022. Архивировано 8 ноября 2022 года.
- ↑ Put a DPAD on that GC! (англ.) (10 мая 2021). Дата обращения: 17 ноября 2022. Архивировано 10 ноября 2022 года.