JIT-компилятор в .NET — это сложный и постоянно развивающийся механизм, от которого напрямую зависит производительность кода. Он умеет многое: от inlining и удаления проверок границ до escape-анализа и стекового размещения объектов. Но чтобы эти оптимизации сработали, иногда недостаточно просто написать «рабочий» код.
В докладе мы:
- посмотрим путь развития JIT-компилятора за последние годы;
- разберем, как устроены ключевые оптимизации на уровне алгоритмов, и немного заглянем в исходники;
- обсудим, как особенности кода могут ограничивать JIT (например, использование is T, не sealed-классов и shared generics) и почему обновление .NET-версии часто напрямую влияет на производительность — ведь с каждым релизом JIT учится обрабатывать всё более сложные конструкции;
- увидим, как управлять этими ограничениями системно — через архитектурные решения и правила статического анализа;
- поговорим, в каких ситуациях имеет смысл «помогать» JIT — особенно если вы пишете высоконагруженные или критичные к производительности участки системы.