Xamarin.Mac önceden derleme

Genel bakış

Önceden (AOT) derleme, başlangıç performansını geliştirmeye yönelik güçlü bir iyileştirme tekniğidir. Bununla birlikte, derleme sürenizi, uygulama boyutunuzu ve program yürütmenizi derin şekillerde de etkiler. Bunun getirdiği dengeleri anlamak için bir uygulamanın derlenmesi ve yürütülmesine biraz göz atacağız.

C# ve F# gibi yönetilen dillerde yazılan kod, IL adlı bir ara gösterime derlenmiş. Kitaplığınızda ve program derlemelerinde depolanan bu IL, işlemci mimarileri arasında nispeten kompakt ve taşınabilir. Ancak IL, yalnızca bir ara yönerge kümesidir ve bir noktada IL'nin işlemciye özgü makine koduna çevrilmesi gerekir.

Bu işlemin yapılabilmesi için iki nokta vardır:

  • Tam zamanında (JIT) – Uygulamanızın başlatılması ve yürütülmesi sırasında IL, makine koduna bellekte derlenmiş olur.
  • Önceden (AOT) – Derleme sırasında IL derlenir ve yerel kitaplıklara yazılır ve uygulama paketinizde depolanır.

Her seçeneğin bir dizi avantajı ve dezavantajı vardır:

  • JIT
    • Başlangıç Zamanı – JIT derlemesi başlangıçta yapılmalıdır. Çoğu uygulama için bu, 100ms sırasına göredir, ancak büyük uygulamalar için bu kez önemli ölçüde daha fazla olabilir.
    • Yürütme – JIT kodu kullanılan belirli bir işlemci için iyileştirilebildiği için biraz daha iyi kod oluşturulabilir. Çoğu uygulamada bu, en fazla birkaç yüzde puanı daha hızlıdır.
  • AOT
    • Başlangıç Süresi – Önceden derlenmiş dylibs'lerin yüklenmesi JIT derlemelerinden önemli ölçüde daha hızlıdır.
    • Disk Alanı – Ancak bu boyalar önemli miktarda disk alanı alabilir. Hangi derlemelerin AOTed olmasına bağlı olarak, uygulamanızın kod bölümünün boyutunu iki katına veya daha fazla olabilir.
    • Derleme Süresi – AOT derlemesi, JIT'nin büyük ölçüde yavaşlamasını sağlar ve bunu kullanarak derlemeleri yavaşlatacaktır. Bu yavaşlama, derlenen derlemelerin boyutuna ve sayısına bağlı olarak saniyelerden bir dakikaya veya daha fazlasına kadar değişebilir.
    • Karartma – Tersine mühendislik işlemi makine koduna göre önemli ölçüde daha kolay olan IL,hassas kodun karartılması için mutlaka kaldırılabilir. Bunun için aşağıda açıklanan "Karma" seçeneği gerekir.

AOT'yi etkinleştirme

AOT seçenekleri, gelecekteki bir güncelleştirmede Mac Derleme bölmesine eklenecektir. O zamana kadar, AOT'nin etkinleştirilmesi için Mac Derlemesi'ndeki "Ek mmp bağımsız değişkenleri" alanı aracılığıyla bir komut satırı bağımsız değişkeni geçirilmesi gerekir. Seçenekler şunlardır:

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

Karma AOT

Bir macOS uygulamasının yürütülmesi sırasında çalışma zamanı varsayılan olarak AOT derlemesi tarafından oluşturulan yerel kitaplıklardan yüklenen makine kodunu kullanır. Ancak, JIT derlemesinin önemli ölçüde daha iyileştirilmiş sonuçlar üretebildiği trambolinler gibi bazı kod alanları vardır. Bunun için yönetilen derlemeler IL'nin kullanılabilir olması gerekir. iOS'ta, uygulamalar JIT derlemesinin herhangi bir kullanımından kısıtlanır; kodun bu bölümü de AOT derlenir.

Karma seçeneği, derleyiciye hem bu bölümü derlemesini (iOS gibi) hem de IL'nin çalışma zamanında kullanılamayacağını varsaymasını ister. Bu IL daha sonra derlemeden sonra kaldırılabilir. Yukarıda belirtildiği gibi, çalışma zamanı bazı yerlerde daha az iyileştirilmiş yordamlar kullanmaya zorlanır.

Dikkat edilecek diğer konular

İşlenen derlemelerin boyutları ve sayısı ile AOT ölçeğinin olumsuz sonuçları. Örneğin Tam hedef çerçeve , Modern'den çok daha büyük bir Temel Sınıf Kitaplığı (BCL) içerir ve bu nedenle AOT önemli ölçüde daha uzun sürer ve daha büyük paketler üretir. Bu, Tam hedef çerçevenin Bağlantı ile uyumsuzluğuyla birleştirilir ve bu da kullanılmayan kodu çıkarır. En iyi sonuçları elde etmek için uygulamanızı Modern'e taşımayı ve Bağlamayı etkinleştirmeyi göz önünde bulundurun.

AOT'nin ek avantajlarından biri, yerel hata ayıklama ve profil oluşturma araç zincirleriyle geliştirilmiş etkileşimlerle birlikte gelir. Kod tabanının büyük çoğunluğu önceden derlendiğinden, yerel kilitlenme raporları, profil oluşturma ve hata ayıklama içinde daha kolay okunabilen işlev adları ve simgeleri olacaktır. JIT tarafından oluşturulan işlevler bu adlara sahip değildir ve genellikle çözülmesi çok zor olan adsız onaltılık uzaklıklar olarak gösterilir.