TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.6K subscribers
Post #6270 4.45K
👨‍💻 Как ускорить запуск .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 сервиса?

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

#буст
  • 👍 15
  • ❤ 4
  • 🔥 3
  • ❤‍🔥 1
More from @csharpproglib
  1. Sep 30, 2026📝 Логирование со строковой интерполяцией Логирование c интерполяцией строк один из самых…
  2. Sep 28, 2026👨‍💻 Не показывайте технические ошибки пользователям Когда приложение падает с необработа…
  3. Sep 26, 2026📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #garbage_collector
  4. Sep 25, 2026🔐 NuGet: Microsoft меняет сертификат подписи С 23 сентября Microsoft использует новый сер…
  5. Sep 24, 2026🤩 Как поймать зависший .NET-сервис Приложение начинает тормозить, запросы зависают, а в л…
  6. Sep 23, 2026⚙️ yield return не бесплатный Итераторы выглядят просто, но работают иначе: IEnumerable<in…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →