CSHARPPROGLIB Telegram 6270
👨‍💻 Как ускорить запуск .NET приложения

1️⃣ Сначала измерьте

Включите EventPipe/PerfView/dotnet-trace для старта: какие сборки грузятся, на что тратится время.

Снимите таймлайны: «вход в Main → готовность endpoint'ов / UI».

Измеряйте Release-сборку, без отладчиков и без «горячих» кэшей.

2️⃣ Оптимизации сборки

• ReadyToRun (R2R)
Компилирует IL в машинный код при публикации:
<!-- Directory.Build.props или csproj -->
<PropertyGroup>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>partial</TrimMode> <!-- для библиотек и DI -->
</PropertyGroup>


• PGO (Profile-Guided Optimization) + R2R
Соберите профиль и примените при crossgen2 (даёт лучший порядок/инлайнинг для «горячего» пути старта).

• NativeAOT
Полностью нативный бинарь, почти мгновенный старт. Подходит для CLI/служб с ограниченным набором фич и для «узких» сервисов или edge-эндпоинтов в вебе.

3️⃣ Минимизация загрузки и работы на старте

Уберите всё, что не нужно при старте: тяжёлые клиенты (БД, кеши, внешние SDK) создавайте лениво, после поднятия хостинга.

Прогружайте конфигурацию минимально: уберите лишние провайдеры, большие JSON-файлы, многократные AddJsonFile.

Логи на старте — только консоль/минимальный уровень, позже можно расширить.

Уберите неиспользуемые пакеты, объедините внутренние пакеты, избегайте древовидных зависимостей ради одной функции.

Встроенный контейнер быстрый, но следите за графом:

• Регайте Singleton/Scoped только когда нужно.
• Избегайте «сервисов-глобов» с большим конструктором на десятки зависимостей.
• Используйте фабрики/Lazy для тяжёлых зависимостей.

4️⃣ ASP.NET Core: быстрый подъём хоста

Минимальный хостинг и только нужные middleware:
var builder = WebApplication.CreateBuilder(args);
// Оставьте только то, что нужно для старта
builder.Services.AddRouting();
var app = builder.Build();
// Критичный middleware – ближе к началу конвейера
app.MapGet("/healthz", () => "OK");
app.Run();


Отключите всё, что делает работу на старте: избыточная авто-дискавери Swagger, отражение в валидации, сканирование сборок.

5️⃣ Инициализация после старта

Разнесите готовность принимать трафик и полную готовность всех подсистем:

• Быстрый /healthz сразу.
• Прогрев кэшей/метаданных — в фоне IHostedService с низким приоритетом.
• В оркестраторе задайте readinessProbe после минимального старта, а «тяжёлый прогрев» делайте уже на фоне.

6️⃣ Тримминг: аккуратно, но даёт эффект

PublishTrimmed=true + TrimMode=partial часто снижает размер и ускоряет загрузку.

Обязательно добавляйте DynamicDependency/UnconditionalSuppressMessage/RD.XML для сохранения типов, которые нужны через рефлексию (DI/JSON/ORM).

💬 А у вас сколько секунд уходит на холодный старт .NET сервиса?

🐸Библиотека шарписта

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍153🔥3❤‍🔥1



tgoop.com/csharpproglib/6270
Create:
Last Update:

👨‍💻 Как ускорить запуск .NET приложения

1️⃣ Сначала измерьте

Включите EventPipe/PerfView/dotnet-trace для старта: какие сборки грузятся, на что тратится время.

Снимите таймлайны: «вход в Main → готовность endpoint'ов / UI».

Измеряйте Release-сборку, без отладчиков и без «горячих» кэшей.

2️⃣ Оптимизации сборки

• ReadyToRun (R2R)
Компилирует IL в машинный код при публикации:

<!-- Directory.Build.props или csproj -->
<PropertyGroup>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>partial</TrimMode> <!-- для библиотек и DI -->
</PropertyGroup>


• PGO (Profile-Guided Optimization) + R2R
Соберите профиль и примените при crossgen2 (даёт лучший порядок/инлайнинг для «горячего» пути старта).

• NativeAOT
Полностью нативный бинарь, почти мгновенный старт. Подходит для CLI/служб с ограниченным набором фич и для «узких» сервисов или edge-эндпоинтов в вебе.

3️⃣ Минимизация загрузки и работы на старте

Уберите всё, что не нужно при старте: тяжёлые клиенты (БД, кеши, внешние SDK) создавайте лениво, после поднятия хостинга.

Прогружайте конфигурацию минимально: уберите лишние провайдеры, большие JSON-файлы, многократные AddJsonFile.

Логи на старте — только консоль/минимальный уровень, позже можно расширить.

Уберите неиспользуемые пакеты, объедините внутренние пакеты, избегайте древовидных зависимостей ради одной функции.

Встроенный контейнер быстрый, но следите за графом:

• Регайте Singleton/Scoped только когда нужно.
• Избегайте «сервисов-глобов» с большим конструктором на десятки зависимостей.
• Используйте фабрики/Lazy для тяжёлых зависимостей.

4️⃣ ASP.NET Core: быстрый подъём хоста

Минимальный хостинг и только нужные middleware:
var builder = WebApplication.CreateBuilder(args);
// Оставьте только то, что нужно для старта
builder.Services.AddRouting();
var app = builder.Build();
// Критичный middleware – ближе к началу конвейера
app.MapGet("/healthz", () => "OK");
app.Run();


Отключите всё, что делает работу на старте: избыточная авто-дискавери Swagger, отражение в валидации, сканирование сборок.

5️⃣ Инициализация после старта

Разнесите готовность принимать трафик и полную готовность всех подсистем:

• Быстрый /healthz сразу.
• Прогрев кэшей/метаданных — в фоне IHostedService с низким приоритетом.
• В оркестраторе задайте readinessProbe после минимального старта, а «тяжёлый прогрев» делайте уже на фоне.

6️⃣ Тримминг: аккуратно, но даёт эффект

PublishTrimmed=true + TrimMode=partial часто снижает размер и ускоряет загрузку.

Обязательно добавляйте DynamicDependency/UnconditionalSuppressMessage/RD.XML для сохранения типов, которые нужны через рефлексию (DI/JSON/ORM).

💬 А у вас сколько секунд уходит на холодный старт .NET сервиса?

🐸Библиотека шарписта

#буст

BY Библиотека шарписта | C#, F#, .NET, ASP.NET


Share with your friend now:
tgoop.com/csharpproglib/6270

View MORE
Open in Telegram


Telegram News

Date: |

Each account can create up to 10 public channels ZDNET RECOMMENDS Image: Telegram. SUCK Channel Telegram With Bitcoin down 30% in the past week, some crypto traders have taken to Telegram to “voice” their feelings.
from us


Telegram Библиотека шарписта | C#, F#, .NET, ASP.NET
FROM American