Wednesday, December 26, 2012

Многоядерная JIT-компиляция в .NET 4.5

Исторически разработчики .NET использовали генератор образов в машинном коде Ngen. Это отлично работает, если у вас есть инсталлятор, и вы можете сгенерировать эти образы во время установки приложения. Но в других случаях, например когда у вас нет установщика или вы не имеете доступ к Ngen, ваше приложение будет производить JIT-компиляцию по мере необходимости, что замедлит его загрузку. Разработчики CLR предоставили решение в новой версии .NET – многоядерная JIT-компиляция с возможностью создавать профили оптимизации.

При многоядерной JIT-компиляции код компилируется на двух ядрах параллельно. Чем больше кода вы выполняете во время загрузки, тем более заметным будет ускорение от многоядерного JIT. Вы можете получить уменьшение времени загрузки на 20-50%, что является хорошей новостью для тех, кто разрабатывает большие приложения и не имеют возможности использовать Ngen. Для этого потребуется добавить в ваш код всего пару строчек кода.

Как это работает

В общем случае вам понадобится вызвать всего два метода в своём приложении:
Указать место, где будут храниться профили многоядерного JIT,
И начать профайлинг, вызвав метод StartProfile.

.NET runtime создаст профиль исходя из последовательностей вызванных методов во время работы вашего приложения. Этот профиль будет сохранён на диск. Проще говоря, при первом запуске произойдёт «запись» профиля (картинки взяты отсюда):

Inline image 1

...
...

Используем многоядерную JIT-компиляцию

Использовать многоядерную JIT-компиляцию просто. В .NET 4.5 присутствует класс System.Runtime.ProfileOptimization, который мы можем использовать для того, чтобы начать запись профиля во время старта приложения. Этот код выглядит примерно так:

ProfileOptimization.SetProfileRoot(@"C:\MyApp");
ProfileOptimization.StartProfile("LaunchProfile");

SetProfileRoot — включает оптимизацию для текущего AppDomain и устанавливает директорию, куда будет сохраняться профиль оптимизации. Этот метод игнорируется на одноядерных комрьютерах.

StartProfile – начинает профайлинг и just-in-time компиляцию для тех методов, которые были записаны в профиль (если он уже есть).

Read more: Habrahabr.ru
QR: Inline image 2

Posted via email from Jasper-Net