Kompilace Xamarin. Mac před časem
Přehled
Kompilace v předstihu (AOT) je výkonná technika optimalizace pro zlepšení výkonu při spuštění. Nicméně má vliv i na čas sestavení, velikost aplikace a provádění programu v rámci nadvelkých způsobů. Abychom porozuměli kompromisům, které ukládá, podrobněme do kompilace a provádění aplikace trochu.
Kód napsaný ve spravovaných jazycích, jako je C# a F #, je zkompilován do mezilehlé reprezentace s názvem IL. Tato IL, uložená v sestaveních knihovny a program, je poměrně kompaktní a přenosná mezi architekturami procesoru. IL je ale jenom Pokročilá sada instrukcí a v některých případech je potřeba překládat IL do strojového kódu specifického pro procesor.
Existují dva body, ve kterých lze toto zpracování provést:
- Just in time (JIT) – při spuštění a provádění aplikace je Il zkompilován v paměti do strojového kódu.
- Před časem (AOT) – během sestavování je Il zkompilován a zapsán do nativních knihoven a uložen v rámci sady prostředků aplikace.
Každá z možností má řadu výhod a kompromisů:
- JIT
- Čas spuštění – kompilace JIT musí být provedena při spuštění. Pro většinu aplikací se jedná o pořadí 100 ms, ale pro velké aplikace může být tato doba podstatně větší.
- Spuštění – protože kód JIT může být optimalizován pro používaný procesor, mírně lepší kód může být vygenerován. Ve většině aplikací jde o několik procent rychleji.
- AOT
- Čas spuštění – načítání předem kompilovaných dylibs je výrazně rychlejší než sestavení JIT.
- Místo na disku – tyto dylibs můžou zabírat značné množství místa na disku. V závislosti na tom, která sestavení jsou AOTed, může být dvojnásobná nebo větší velikost části kódu vaší aplikace.
- Čas sestavení – kompilace stromu AOT je výrazně pomalejší než kompilátor JIT a bude ho používat. Tento zpomalení se může pohybovat v rozmezí sekund až jedné minuty, v závislosti na velikosti a počtu kompilovaných sestavení.
- Zmatení – jako Il, který je významně snazší pro zpětnou analýzu než kód počítače, není nezbytně nutné, aby mohl být vykódován citlivý kód. To vyžaduje možnost Hybrid popsána níže.
Povolení AOT
Možnosti AOT budou přidány 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 sestavení 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
Během provádění aplikace macOS modul runtime standardně používá strojový kód načtený z nativních knihoven vytvořených kompilací AOT. Existují však některé oblasti kódu, například Trampolines, kde kompilace JIT může způsobit mnohem více optimalizovaných výsledků. K tomu je potřeba, aby byla k dispozici spravovaná sestavení IL. V systému iOS jsou aplikace omezené na použití kompilace JIT; Tyto části kódu jsou také kompilovány stromu AOT.
Možnost Hybrid instruuje kompilátor, aby zkompiluje tyto oddíly (například iOS), ale také předpokládá, že IL nebude k dispozici za běhu. Tuto úroveň důvěryhodnosti je pak možné vytvořit po sestavení. Jak je uvedeno výše, modul runtime bude nuceně používat méně optimalizované rutiny na některých místech.
Další pravidla
Negativní následky měřítka AOT se škálováním na velikost a počet zpracovaných sestavení. Kompletní Cílová architektura pro příklad obsahuje podstatně větší BCL knihovnu základních tříd () než moderní, takže v AOT bude trvat mnohem delší dobu a vytvoří větší sady prostředků. To je složena z hlediska nekompatibility celého cílového rozhraní s propojením, které odstraní nepoužitý kód. Zvažte přesunutí aplikace do moderního a povolení odkazů pro dosažení nejlepších výsledků.
Jedna další výhoda stromu AOT přináší vylepšené interakce s nativním laděním a profilací sady nástrojů. Vzhledem k tomu, že většina základů kódu bude kompilována před časem, budou mít názvy funkcí a symboly, které budou snáze čteny v nativních zprávách o chybách, profilování a ladění. Funkce generované JIT nemají tyto názvy a často se zobrazují jako nejmenovaná šestnáctková posunutí, která je velmi obtížné přeložit.