В C# мы пишем:
int Double(int x) => x * 2;
var result = Double(21);
Но JIT может решить, что отдельный вызов здесь вообще не нужен.
При inlining тело метода встраивается непосредственно в вызывающий код:
🔴 До:
call Double
↓
x * 2
🔴 После:
21 * 2
Зачем? Меньше накладных расходов на вызов метода, а главное — JIT получает больше кода для последующих оптимизаций. Но inline не означает «метод маленький → обязательно встроить».
JIT учитывает размер метода, частоту вызовов, доступность кода для анализа и другие эвристики. Поэтому даже небольшой метод может не попасть в inline.
📍 А атрибут:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
— это подсказка JIT, а не приказ.
И наоборот, иногда большой метод всё-таки может быть встроен, если JIT считает это выгодным.
Вот почему производительность C# нельзя оценивать только по исходному коду: между C# и CPU есть ещё один слой — JIT и его оптимизатор.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор