poniedziałek, 22 października 2012

Multicore JIT

Aplikacje oparte o platformę .NET podczas uruchomienia muszą zostać skompilowane przez wirtualną maszynę. Kompilacja w przypadku dużej aplikacji może zająć więcej, niż życzyłby sobie tego użytkownik. Jednym z rozwiązań tego problemu jest Ngen.exe - generowany kod jest przerzucony z fazy uruchomienia do instalacji. Rozwiązanie ma to jednak jedną wadę - nadaje się tam, gdzie aplikacja posiada instalator. Innym problemem może być niedostępność tego narzędzia.
W nowym .NET 4.5 wprowadzono Multicore JIT - kompilacja odbywa się na dwóch procesorach. Przyrost w przypadku średnich aplikacji waha się w granicach 20 - 50%. Im większa aplikacja tym większy procent przyśpieszenia.
Jak wygląda w praktyce nowość? Dla przeglądarki Bing osiągnięto rezultat na poziomie 50% (więcej na stronie http://blogs.technet.com/b/windowsserver/archive/2012/06/07/bing-com-runs-on-windows-server-2012.aspx).
Wyniki z innych aplikacji:


W przypadku aplikacji Paint.Net na poniższym wykresie możemy zobaczyć jak zmieniło się zużycie zasobów procesora z i bez Multicore JIT:


W jaki sposób działa Multicore JIT?
Multicore JIT działa w dwóch fazach: nagrywania i odtwarzania. Podczas nagrywania kompilator JIT nagrywa każdą metodę, która jest wywoływana. Kiedy środowisko CLR stwierdzi, że uruchomienie programu zostało zakończone zapisywany jest na dysku profil, zawierający wszystkie uruchomione metody. 


Podczas pierwszego uruchamiania aplikacji wykorzystywane jest nagrywanie. Podczas kolejnych uruchomień aplikacji wczytywany jest z dysku zapisany profil, a uzyskane z niego informacje służą do kompilacji kodu w tle, jeszcze przed jego zażądaniem przez główny wątek.






Rezultatem tych operacji jest poprawienie szybkości uruchamiania aplikacji na maszynach wielordzeniowych - w przypadku stacji wyposażonych w jeden procesor technologia ta jest wyłączona.


Co należy zrobić aby mechanizm działał w mojej aplikacji?
W przypadku aplikacji desktopowych należy dodać w konstruktorze aplikacji następujące instrukcje:


Code:
public App() 
{
    ProfileOptimization.SetProfileRoot(@"C:\MyAppFolder");
    ProfileOptimization.StartProfile("Startup.Profile");
}  

  • SetProfileRoot - determinuje gdzie będą zapisywane nagrane profile
  • StartProfile  - uaktywania Multicore JIT poprzez podanie nazwy profilu
W przypadku ASP.NET sprawa jest jeszcze prostsza i sprowadza się do ustawienia flagi profileGuidedOptimizations:
Code:
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
 <!-- ... -->
 <system.web> 
 <compilation profileGuidedOptimizations="None" /> 
 <!-- ... --> 
 </system.web> 
</configuration>

Brak komentarzy:

Prześlij komentarz