TGViewer
Кодовой Барабанщик Кодовой Барабанщик @drummer_programmer · 112 subscribers
Post #554 68

Forwarded from C# Short Posts 🔞

🎯 Instrumented Tier0: профилирование кода

В прошлый раз мы разобрали два уровня компиляции: Tier0 — быстрый и неоптимизированный, и Tier1 — оптимизированный, для горячих методов. Но между ними прячется ещё одна стадия❗️

Возьмём наш однострочник hello world, завернём его в метод Hello() для удобства измерений и запустим один раз. В сводке JIT будет одна строка:

Program:Hello() [Tier0]


Один вызов — один дешёвый заход на Tier0, и программа кончилась. А теперь позовём тот же метод в цикле много раз:

Program:Hello() [Tier0]
Program:Hello() [Instrumented Tier0]
Program:Hello() [Tier1]


🕵️ Что за Instrumented Tier0?

Это тот же неоптимизированный Tier0, но со встроенными счётчиками. Пока метод работает на нём, рантайм записывает статистику: сколько раз метод вызвали, какие ветки чаще срабатывают, какие типы приходят в вызовы. Такая статистика — это профиль работы метода, а сам сбор называется профилированием

Дальше, на стадии Tier1, JIT оптимизирует метод с учётом профиля его работы, чтобы ускорить его наиболее горячие точки, а не просто делать это наугад

Такая оптимизация называется PGO — Profile-Guided Optimization, и по умолчанию она включена с .NET8

⏱️ Почему до Tier1 теперь два этапа

В прошлом посте я говорил про порог в 30 вызовов между Tier0 и Tier1. Если быть душным точным, это актуально для кода, работающего на .NET < 8 или .NET>= 8, но с отключенной PGO (DOTNET_TieredPGO=0). То есть в более свежих версиях фреймворка путь до Tier1 стал в два раза дольше из-за появления ещё одной стадии, которая длится так же примерно 30 вызовов (ну или смотря что у тебя указано в DOTNET_TC_CallCountThreshold)

Первые 30 вызовов — это обычный Tier0, без особых оптимизаций. На 31-м метод перекомпилируется в Instrumented Tier0, на котором начинает собирать профиль работы метода. Инструментированная версия работает ещё 30 вызовов, и только потом метод компилируется на Tier1 — уже с оптимизациями по профилю. Мотивация простая: чтобы оптимизировать по профилю, профиль сначала надо собрать🧠

🅰️ Что с этим делать

🟢 В релизных сборках кода начиная с .NET8 профилирование включено по умолчанию
🟢 Профилирование позволяет более точно ускорить горячий код: JIT оптимизирует его по реальному поведению
🟢 Прогрев до Tier1 стал дольше: профилю нужно накопиться

А зависит ли этот путь от каких-нибудь факторов? Конечно! Но об этом расскажу в следующем посте 👉

🧑‍💻dp🥁
#dotnet #csharp #инженерныештучки #heavywednesday
  • ❤ 2
More from @drummer_programmer
  1. Sep 27, 2026Это я ездил в Грузию🇬🇪 чтобы воспользоваться нашим продуктом за рубежом🤘 Помимо приложе…
  2. Sep 26, 2026Смотрю #DotNext, жду доклад Димаса из C# Short Posts, который начнётся уже через 15 минут!
  3. Sep 23, 2026Даже самым хардкорным ребятам надо отдыхать, так что отдыхаем, мои чюваки 🕺 🧑‍💻dp🥁 #he…
  4. Sep 20, 2026В последнее время многие сюжеты, которые добавляются в игру #занимательныеистории, так или…
  5. Sep 18, 2026111 - красивое число! 🤩 Спасибо за подписку!
  6. Sep 14, 2026Нашёл тут запрос, по которому #ИИшница рисует такие вот постеры Если нарисуешь свой, закид…
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 →