Udostępnij za pośrednictwem


Kompilacja rozszerzenia Xamarin.Mac z wyprzedzeniem

Omówienie

Przed czasem kompilacja (AOT) to zaawansowana technika optymalizacji w celu poprawy wydajności uruchamiania. Jednak wpływa również na czas kompilacji, rozmiar aplikacji i wykonywanie programu w głęboki sposób. Aby zrozumieć, jakie kompromisy nakłada, przyjrzymy się nieco kompilacji i wykonaniu aplikacji.

Kod napisany w językach zarządzanych, takich jak C# i F#, jest kompilowany do pośredniej reprezentacji o nazwie IL. To IL, przechowywane w bibliotece i zestawach programów, jest stosunkowo kompaktowe i przenośne między architekturami procesora. IL jest jednak tylko pośrednim zestawem instrukcji i w pewnym momencie il będzie musiał zostać przetłumaczony na kod komputera specyficzny dla procesora.

Istnieją dwa punkty, w których można wykonać to przetwarzanie:

  • Just in time (JIT) — podczas uruchamiania i wykonywania aplikacji plik IL jest kompilowany w pamięci do kodu maszynowego.
  • Przed czasem (AOT) — podczas kompilacji il jest kompilowany i zapisywany w bibliotekach natywnych i przechowywanych w pakiecie aplikacji.

Każda opcja ma wiele korzyści i kompromisów:

  • JIT
    • Czas uruchamiania — kompilacja JIT musi być wykonywana podczas uruchamiania. W przypadku większości aplikacji jest to w kolejności 100 ms, ale w przypadku dużych aplikacji tym razem może być znacznie więcej.
    • Wykonanie — ponieważ kod JIT można zoptymalizować pod kątem używanego procesora, można wygenerować nieco lepszy kod. W większości aplikacji jest to co najwyżej kilka punktów procentowych.
  • AOT
    • Czas uruchamiania — ładowanie wstępnie skompilowanych bibliotek dylibów jest znacznie szybsze niż zestawy JIT.
    • Miejsce na dysku — te dylibsy mogą jednak zająć znaczną ilość miejsca na dysku. W zależności od tego, które zestawy są AOTed, może podwoić lub więcej rozmiaru części kodu aplikacji.
    • Czas kompilacji — kompilacja AOT jest znacznie wolniejsza i spowalnia kompilacje korzystające z niej. To spowolnienie może wahać się od sekund do minuty lub więcej, w zależności od rozmiaru i liczby skompilowanych zestawów.
    • Zaciemnianie — ponieważ il, który jest znacznie łatwiejszy w inżynierii odwrotnej niż kod maszynowy, nie musi być pozbawiony, aby pomóc zaciemniać poufny kod. Wymaga to opisanej poniżej opcji "Hybrydowa".

Włączanie usługi AOT

Opcje AOT zostaną dodane do okienka Kompilacja dla komputerów Mac w przyszłej aktualizacji. Do tego czasu włączenie funkcji AOT wymaga przekazania argumentu wiersza polecenia za pośrednictwem pola "Dodatkowe argumenty mmp" w kompilacji dla komputerów Mac. Dostępne są następujące opcje:

--aot[=VALUE]          Specify assemblies that should be AOT compiled
                          - none - No AOT (default)
                          - all - Every assembly in MonoBundle
                          - core - Xamarin.Mac, System, mscorlib
                          - sdk - Xamarin.Mac.dll and BCL assemblies
                          - |hybrid after option enables hybrid AOT which
                          allows IL stripping but is slower (only valid
                          for 'all')
                          - Individual files can be included for AOT via +
                          FileName.dll and excluded via -FileName.dll

                          Examples:
                            --aot:all,-MyAssembly.dll
                            --aot:core,+MyOtherAssembly.dll,-mscorlib.dll

Hybrydowa AOT

Podczas wykonywania aplikacji systemu macOS środowisko uruchomieniowe domyślnie używa kodu maszynowego załadowanego z bibliotek natywnych utworzonych przez kompilację AOT. Istnieją jednak niektóre obszary kodu, takie jak trampoliny, w których kompilacja JIT może generować znacznie bardziej zoptymalizowane wyniki. Wymaga to udostępnienia zarządzanych zestawów IL. W systemie iOS aplikacje są ograniczone do korzystania z kompilacji JIT; sekcja kodu jest również skompilowana przez funkcję AOT.

Opcja hybrydowa instruuje kompilator do kompilowania tej sekcji (na przykład systemu iOS), ale także zakłada, że il nie będzie dostępny w czasie wykonywania. Ten IL można następnie usunąć po kompilacji. Jak wspomniano powyżej, środowisko uruchomieniowe będzie zmuszone do korzystania z mniej zoptymalizowanych procedur w niektórych miejscach.

Dodatkowe uwagi

Negatywne konsekwencje skali AOT z przetworzonymi rozmiarami i liczbą zestawów. Na przykład Pełna struktura docelowa zawiera znacznie większą bibliotekę klas bazowych (BCL) niż nowoczesna, a tym samym znacznie dłużej będzie generować większe pakiety. Jest to złożone przez niezgodność pełnej platformy docelowej z funkcją Linking, która usuwa nieużywany kod. Rozważ przeniesienie aplikacji na nowoczesne i włączenie linku w celu uzyskania najlepszych wyników.

Jedną z dodatkowych korzyści płynącymi z funkcji AOT są ulepszone interakcje z natywnymi łańcuchami narzędzi debugowania i profilowania. Ponieważ większość bazy kodu zostanie skompilowana przed upływem czasu, będzie zawierać nazwy funkcji i symbole, które są łatwiejsze do odczytania wewnątrz natywnych raportów awarii, profilowania i debugowania. Wygenerowane funkcje JIT nie mają tych nazw i często są wyświetlane jako nienazwane przesunięcia szesnastkowy, które są bardzo trudne do rozpoznania.