Xamarin. Mac-Vorkompilierung vor der ZeitXamarin.Mac ahead of time compilation

ÜbersichtOverview

Die AOT-Kompilierung (Ahead of Time) ist eine leistungsstarke Optimierungsmethode zum Verbessern der Startleistung.Ahead of time (AOT) compilation is a powerful optimization technique for improving startup performance. Dies wirkt sich jedoch auf die Buildzeit, die Anwendungs Größe und die Programmausführung aus.However, it also affects your build time, application size, and program execution in profound ways. Um die vor-und Nachteile zu verstehen, werden wir uns ein wenig mit der Kompilierung und Ausführung einer Anwendung beschäftigen.To understand the tradeoffs it imposes, we’re going to dive a bit into the compilation and execution of an application.

In verwalteten Sprachen geschriebene Codes, wie z C# . F#b. und, werden in eine zwischen Darstellung namens IL kompiliert.Code written in managed languages, such as C# and F#, is compiled to an intermediate representation called IL. Diese Il, die in der Bibliothek und den programmassemblys gespeichert ist, ist relativ kompakt und portabel zwischen Prozessorarchitekturen.This IL, stored in your library and program assemblies, is relatively compact and portable between processor architectures. Il ist jedoch nur ein Zwischensatz von Anweisungen, und zu einem bestimmten Zeitpunkt muss Il in Computercode übersetzt werden, der für den Prozessor spezifisch ist.IL, however, is only an intermediate set of instructions and at some point that IL will need to be translated into machine code specific to the processor.

Es gibt zwei Punkte, an denen diese Verarbeitung ausgeführt werden kann:There are two points in which this processing can be done:

  • Just-in-time-– (Just-in-Time) während des Starts und der Ausführung der Anwendung wird der IL-Code im Arbeitsspeicher für den ComputerJust in time (JIT) – During startup and execution of your application the IL is compiled in memory to machine code.
  • Ahead-of-Time (AOT) – während des Builds wird die IL kompiliert und in Native Bibliotheken geschrieben und in Ihrem Anwendungs Bündel gespeichert.Ahead of time (AOT) – During build the IL is compiled and written out to native libraries and stored within your application bundle.

Jede Option bietet eine Reihe von Vorteilen und Kompromisse:Each option has a number of benefits and tradeoffs:

  • JITJIT
    • Startzeit – die JIT-Kompilierung muss beim Start ausgeführt werden.Startup Time – JIT compilation must be done on startup. Bei den meisten Anwendungen liegt dieser Wert in der Reihenfolge von 100 MS, aber für große Anwendungen kann diese Zeit deutlich mehr sein.For most applications this is on the order of 100ms, but for large applications this time can be significantly more.
    • Ausführung – da der JIT-Code für den verwendeten Prozessor optimiert werden kann, kann etwas besserer Code generiert werden.Execution – As the JIT code can be optimized for the specific processor being used, slightly better code can be generated. In den meisten Anwendungen sind dies höchstens einige Prozentpunkte schneller.In most applications this is a few percentage points faster at most.
  • AOTAOT
    • Startzeit – das Laden vorkompilierter dylisb ist erheblich schneller als JIT-Assemblys.Startup Time – Loading pre-compiled dylibs is significantly faster than JIT assemblies.
    • Speicherplatz – diese dylisb können einen erheblichen Speicherplatz beanspruchen.Disk Space – Those dylibs can take a significant amount of disk space however. Je nachdem, welche Assemblys erstellt werden, kann die Größe des Codeteils der Anwendung doppelt oder mehr betragen.Depending on which assemblies are AOTed, it can double or more the size of the code portion of your application.
    • Buildzeit – die AOT-Kompilierung ist erheblich langsamer als die JIT-Kompilierung und verlangsamt Builds mit der Anwendung.Build Time – AOT compilation is significantly slower that JIT and will slow builds using it. Diese Verlangsamung kann je nach Größe und Anzahl der kompilierten Assemblys von Sekunden bis zu einer Minute liegen.This slowdown can range from seconds up to a minute or more, depending on the size and number of assemblies compiled.
    • Obfuskations – da die Il, die wesentlich einfacher umzukehren ist als Computercode, nicht unbedingt erforderlich ist, ist Sie nicht unbedingt erforderlich, um den sensiblen Code zu verbergen.Obfuscation – As the IL, which is significantly easier to reverse engineer than machine code, is not necessarily required it can be stripped to help obfuscate sensitive code. Hierfür ist die Option "Hybrid" erforderlich.This requires the "Hybrid” option describe below.

Aktivieren von AOTEnabling AOT

In einem zukünftigen Update werden dem Mac-Buildbereich AOT-Optionen hinzugefügt.AOT options will be added to the Mac Build pane in a future update. Bis dahin erfordert die Aktivierung von AOT das Übergeben eines Befehlszeilen Arguments über das Feld "zusätzliche MMP-Argumente" im Mac-Build.Until then, enabling AOT requires passing a command line argument via the “Additional mmp arguments” field in Mac Build. Dies sind die Optionen:The options are as follows:

--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

Hybrid-AOTHybrid AOT

Während der Ausführung einer macOS-Anwendung verwendet die Laufzeit standardmäßig Computercode, der aus den von der AOT-Kompilierung erstellten nativen Bibliotheken geladen wurde.During execution of a macOS application the runtime defaults to using machine code loaded from the native libraries produced by AOT compilation. Es gibt jedoch einige Code Bereiche, wie z. b. Trampoline, bei denen die JIT-Kompilierung erheblich optimierte Ergebnisse liefern kann.There are, however, some areas of code such as trampolines, where JIT compilation can produce significantly more optimized results. Hierfür ist es erforderlich, dass die verwalteten Assemblys Il verfügbar sind.This requires the managed assemblies IL to be available. Unter IOS sind Anwendungen von der Verwendung der JIT-Kompilierung eingeschränkt; Diese Code Abschnitte werden ebenfalls mit AOT kompiliert.On iOS, applications are restricted from any use of JIT compilation; those section of code are AOT compiled as well.

Die Hybrid-Option weist den Compiler an, diesen Abschnitt (z. b. IOS) zu kompilieren, wobei jedoch davon ausgegangen wird, dass die Il zur Laufzeit nicht verfügbar ist.The hybrid option instructs the compiler to both compile these section (like iOS) but also to assume that the IL will not be available at runtime. Diese Il kann dann nach dem Build entfernt werden.This IL can then be stripped post build. Wie bereits erwähnt, wird die Laufzeit gezwungen, weniger optimierte Routinen an manchen Stellen zu verwenden.As noted above, the runtime will be forced to use less optimized routines in some places.

Weitere ÜberlegungenFurther considerations

Die negativen Konsequenzen der AOT-Skalierung in Bezug auf die Größe und Anzahl der verarbeiteten Assemblys.The negative consequences of AOT scale with the sizes and number of assemblies processed. Das vollständige Ziel Framework enthält beispielsweise eine deutlich größere Basisklassen Bibliothek (Base Class Library, BCL) als modern. Folglich nimmt AOT erheblich mehr Zeit in Anspruch und erzeugt größere Bündel.The Full target framework for example contains a significantly larger Base Class Library (BCL) than Modern, and thus AOT will take significantly longer and produce larger bundles. Dies wird durch die Inkompatibilität des vollständigen Ziel Frameworks mit der Verknüpfung verstärkt, wodurch nicht verwendeter Code entfernt wird.This is compounded by the Full target framework’s incompatibility with Linking, which strips out unused code. Erwägen Sie, die Anwendung auf die moderne zu verschieben und die Verknüpfung für die besten Ergebnisse zu ermöglichen.Consider moving your application to Modern and enabling Linking for the best results.

Ein zusätzlicher Vorteil von AOT bietet verbesserte Interaktionen mit nativen Debugging-und Profil Erstellungs Toolketten.One additional benefit of AOT comes with improved interactions with native debugging and profiling toolchains. Da eine große Mehrheit der Codebasis im Voraus kompiliert wird, enthält Sie Funktionsnamen und Symbole, die in nativen Absturzberichten, Profilerstellung und Debuggen leichter lesbar sind.Since a vast majority of the codebase will be compiled ahead of time, it will have function names and symbols that are easier to read inside native crash reports, profiling, and debugging. JIT-generierte Funktionen haben diese Namen nicht und werden oft als unbenannte Hex-Offsets angezeigt, die sehr schwer zu beheben sind.JIT generated functions do not have these names and often show up as unnamed hex offsets that are very difficult to resolve.