Share via


Compilazione anticipata di Xamarin.Mac

Panoramica

La compilazione AOT (Ahead of Time) è una potente tecnica di ottimizzazione per migliorare le prestazioni di avvio. Tuttavia, influisce anche sul tempo di compilazione, sulle dimensioni dell'applicazione e sull'esecuzione del programma in modi profondi. Per comprendere i compromessi che impone, si esaminerà un po' la compilazione e l'esecuzione di un'applicazione.

Il codice scritto in linguaggi gestiti, ad esempio C# e F#, viene compilato in una rappresentazione intermedia denominata IL. Questo codice IL, archiviato nelle librerie e negli assembly del programma, è relativamente compatto e portabile tra le architetture del processore. IL, tuttavia, è solo un set intermedio di istruzioni e a un certo punto che il deve essere convertito in codice computer specifico del processore.

L'elaborazione può essere eseguita in due punti:

  • Just-in-time (JIT): durante l'avvio e l'esecuzione dell'applicazione, il servizio di bilanciamento del carico interno viene compilato in memoria nel codice del computer.
  • In anticipo (AOT): durante la compilazione il servizio di integrazione viene compilato e scritto in librerie native e archiviate all'interno del bundle dell'applicazione.

Ogni opzione presenta diversi vantaggi e compromessi:

  • JIT
    • Tempo di avvio: la compilazione JIT deve essere eseguita all'avvio. Per la maggior parte delle applicazioni si tratta dell'ordine di 100 ms, ma per le applicazioni di grandi dimensioni questa volta può essere significativamente più grande.
    • Esecuzione : poiché il codice JIT può essere ottimizzato per il processore specifico usato, è possibile generare codice leggermente migliore. Nella maggior parte delle applicazioni si tratta di alcuni punti percentuali più veloci al massimo.
  • AOT
    • Tempo di avvio: il caricamento di dylib precompilato è notevolmente più veloce rispetto agli assembly JIT.
    • Spazio su disco: questi dylib possono tuttavia richiedere una quantità significativa di spazio su disco. A seconda degli assembly AOTed, può raddoppiare o più le dimensioni della parte di codice dell'applicazione.
    • Tempo di compilazione: la compilazione AOT è notevolmente più lenta e rallenta le compilazioni usandola. Questo rallentamento può variare da secondi fino a un minuto o più, a seconda delle dimensioni e del numero di assembly compilati.
    • Offuscamento : poiché il servizio di bilanciamento del carico interno, che è notevolmente più semplice da invertire rispetto al codice del computer, non è necessariamente necessario che possa essere rimosso per offuscare il codice sensibile. Per questa operazione è necessaria l'opzione "Ibrida" descritta di seguito.

Abilitazione di AOT

Le opzioni AOT verranno aggiunte al riquadro Compilazione Mac in un aggiornamento futuro. Fino ad allora, l'abilitazione di AOT richiede il passaggio di un argomento della riga di comando tramite il campo "Argomenti mmp aggiuntivi" in Mac Build. Le opzioni sono le seguenti:

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

AOT ibrido

Durante l'esecuzione di un'applicazione macOS il runtime usa per impostazione predefinita il codice del computer caricato dalle librerie native prodotte dalla compilazione AOT. Esistono tuttavia alcune aree di codice come i trampolini, in cui la compilazione JIT può produrre risultati notevolmente più ottimizzati. Ciò richiede che gli assembly gestiti IL siano disponibili. In iOS le applicazioni sono limitate da qualsiasi uso della compilazione JIT; anche queste sezioni di codice sono compilate con AOT.

L'opzione ibrida indica al compilatore di compilare entrambe queste sezioni ,ad esempio iOS, ma anche di presupporre che il servizio di integrazione non sarà disponibile in fase di esecuzione. Questo IL può quindi essere rimosso dopo la compilazione. Come indicato in precedenza, il runtime sarà costretto a usare routine meno ottimizzate in alcune posizioni.

Altre considerazioni

Conseguenze negative della scala AOT con le dimensioni e il numero di assembly elaborati. Il framework di destinazione completo, ad esempio, contiene una libreria di classi base significativamente più grande rispetto a Modern e pertanto AOT richiederà molto più tempo e produrrà bundle di dimensioni maggiori. Questo è composto dall'incompatibilità del framework di destinazione completo con Linking, che rimuove il codice inutilizzato. Prendere in considerazione lo spostamento dell'applicazione in Modern e l'abilitazione del collegamento per ottenere risultati ottimali.

Un vantaggio aggiuntivo di AOT include interazioni migliorate con strumenti di debug e profilatura nativi. Poiché la maggior parte della codebase verrà compilata in anticipo, avrà nomi e simboli di funzione più facili da leggere all'interno di report di arresto anomalo nativo, profilatura e debug. Le funzioni generate da JIT non hanno questi nomi e spesso vengono visualizzate come offset esadecimale senza nome che sono molto difficili da risolvere.