Kompilace Xamarin.Mac předem
Přehled
Kompilace AOT (Head of Time) je výkonná technika optimalizace pro zlepšení výkonu při spuštění. Ovlivňuje ale také čas sestavení, velikost aplikace a provádění programu hlubokými způsoby. Abychom pochopili kompromisy, které představuje, podíváme se trochu na kompilaci a spuštění aplikace.
Kód napsaný ve spravovaných jazycích, jako je C# a F#, se kompiluje do zprostředkující reprezentace označované jako IL. Tato IL uložená v knihovně a sestaveních programů je relativně kompaktní a přenosná mezi architekturami procesoru. IL je však pouze zprostředkující sada instrukcí a v určitém okamžiku bude nutné il přeložit na strojový kód specifický pro procesor.
Toto zpracování lze provést dvěma body:
- Za běhu (JIT) – Během spouštění a spouštění aplikace se IL kompiluje do paměti pro strojový kód.
- Předem (AOT) – Během sestavování se il zkompiluje a zapíše do nativních knihoven a uloží se v rámci vaší sady aplikací.
Každá možnost má řadu výhod a kompromisů:
- JIT
- Čas spuštění – kompilace JIT musí být provedena při spuštění. U většiny aplikací je to v pořadí 100 m, ale u velkých aplikací může být tentokrát výrazně více.
- Provádění – protože kód JIT je možné optimalizovat pro konkrétní použitý procesor, lze generovat mírně lepší kód. Ve většině aplikací je to maximálně několik procentních bodů rychleji.
- AOT
- Čas spuštění – Načítání předkompilovaných knihovny dylib je výrazně rychlejší než sestavení JIT.
- Místonach V závislosti na tom, která sestavení jsou AOTed, může zdvojnásobit nebo více velikost části kódu vaší aplikace.
- Čas sestavení – kompilace AOT je výrazně pomalejší, že JIT a bude ho používat pomalu. Toto zpomalení může být v závislosti na velikosti a počtu kompilovaných sestavení v rozsahu od sekund až do minuty.
- Obfuskace – jako IL, což je výrazně snazší zpětnou analýzu než strojový kód, není nutně nutné, aby bylo možné odstranit, aby pomohl obfuskaci citlivého kódu. To vyžaduje možnost Hybrid (Hybridní), která je popsána níže.
Povolení AOT
Možnosti AOT se přidají do podokna Sestavení mac v budoucí aktualizaci. Do té doby povolení AOT vyžaduje předání argumentu příkazového řádku prostřednictvím pole Další argumenty mmp v buildu Mac. Možnosti jsou tyto:
--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
Hybridní AOT
Při spouštění aplikace pro macOS se modul runtime standardně používá pomocí strojového kódu načteného z nativních knihoven vytvořených kompilací AOT. Existují však některé oblasti kódu, jako jsou trampoliny, kde kompilace JIT může vést k výrazně optimalizovanějším výsledkům. To vyžaduje, aby byla dostupná spravovaná sestavení IL. V iOSu jsou aplikace omezeny na jakékoli použití kompilace JIT; tyto části kódu jsou také zkompilovány AOT.
Hybridní možnost dává kompilátoru pokyn, aby zkompiloval obě tyto části (například iOS), ale také předpokládá, že il nebude za běhu k dispozici. Tento IL pak může být oříznutý po sestavení. Jak je uvedeno výše, modul runtime bude nucen na některých místech používat méně optimalizované rutiny.
Další aspekty
Negativní důsledky škálování AOT s velikostmi a počtem zpracovaných sestavení. Úplná cílová architektura například obsahuje výrazně větší základní knihovnu tříd (BCL) než moderní, a proto AOT bude trvat výrazně déle a vytvoří větší svazky. Tato funkce je složena z nekompatibilitě cílové architektury s propojením, která odstraní nepoužívaný kód. Zvažte přesunutí aplikace do moderního prostředí a povolení propojení pro nejlepší výsledky.
Další výhodou AOT je vylepšená interakce s nativními sadami nástrojů ladění a profilace. Vzhledem k tomu, že velká většina základu kódu bude předem zkompilována, bude mít názvy a symboly funkcí, které se snadněji čtou v nativních sestavách o chybách, profilaci a ladění. Vygenerované funkce JIT tyto názvy nemají a často se zobrazují jako nepojmenované šestnáctkové posuny, které jsou velmi obtížné vyřešit.