Xamarin.Mac zamanından önce derleme

Genel Bakış

Zamanından (AOT) derleme, başlangıç performansını geliştirmeye yönelik güçlü bir iyileştirme tekniğidir. Ancak derleme sürenizi, uygulama boyutunu ve program yürütmenizi de etkili bir şekilde etkiler. Bunun neden olduğu takasları anlamak için, bir uygulamanın derlenmesine ve yürütülmesine biraz yer ve sonra da bakmış oluruz.

C# ve F# gibi yönetilen dillerde yazılan kod, IL adlı bir ara gösterime derlenmiş. Kitaplık ve program derlemeleri içinde depolanan bu IL, görece küçük ve işlemci mimarileri arasında taşınabilir. Ancak IL yalnızca bir ara yönergeler kümesidir ve bir noktada IL'nin işlemciye özgü makine koduna çevrilecek olması gerekir.

Bu işlemenin yapltırıl olduğu iki nokta vardır:

  • Tam zamanında (JIT) – Uygulamanın başlatılması ve yürütülmesi sırasında IL bellekte makine koduna derlenmiş.
  • Zamanından önce (AOT) – Derleme sırasında IL derlenmiş ve yerel kitaplıklara yazılır ve uygulama paketinizin içinde depolanır.

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

  • JIT
    • Başlangıç Zamanı – Başlangıçta JIT derlemesi yapılması gerekir. Çoğu uygulama için bu değer 100m'ler sırasına göredir, ancak büyük uygulamalar için bu süre önemli ölçüde daha fazla olabilir.
    • Yürütme: JIT kodu, kullanılan belirli işlemci için iyileştirilmiş olduğundan biraz daha iyi kod oluşturabilirsiniz. Çoğu uygulama için bu, en fazla birkaç yüzde noktası daha hızlıdır.
  • AOT
    • Başlangıç Zamanı – Önceden derlenmiş dylib'leri yükleme işlemi JIT derlemelerinden önemli ölçüde daha hızlıdır.
    • Disk Alanı – Bu diskler önemli miktarda disk alanı aldırabilirsiniz. Hangi derlemelerin AOTed' olduğuna bağlı olarak, uygulamanın kod bölümünün boyutunu iki veya daha fazla katına çıkarabilirsiniz.
    • Derleme Zamanı – AOT derlemesi bu JIT'den önemli ölçüde daha yavaştır ve bunu kullanarak derlemeleri yavaşlatabilir. Bu yavaşlama, derlenmiş derlemelerin boyutuna ve sayısına bağlı olarak saniyeler ile bir dakika veya daha fazla arasında sürebilir.
    • Karartma– Makine kodundan çok tersine mühendislik yapmak çok daha kolay olan IL olarak, hassas kodun karartılmış olması için bu kodun çıkarılmış olması şart değildir. Bunun için "Karma" seçeneği aşağıda açıklanmıştır.

AOT'i etkinleştirme

AOT seçenekleri, gelecek bir güncelleştirmede Mac Derleme bölmesine eklenecektir. O zamana kadar AOT'nin etkinleştirilmesi için Mac Derlemesi'nin "Ek mmp bağımsız değişkenleri" alanı aracılığıyla bir komut satırı bağımsız değişkeni geçirmeniz 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

Hibrit AOT

Bir macOS uygulamasının yürütülmesi sırasında çalışma zamanı varsayılan olarak AOT derlemesi tarafından üretilen yerel kitaplıklardan yüklenen makine kodunu kullanır. Ancak, JIT derlemesi önemli ölçüde daha iyileştirilmiş sonuçlar üretebilir, bazı kod alanları da vardır. Bu, il yönetilen derlemelerinin kullanılabilir olması gerektirir. iOS'ta uygulamalar herhangi bir JIT derleme kullanımıyla kısıtlanır; Kodun bu bölümü de AOT'tır.

Karma seçenek, derleyiciye hem bu bölümü derlemesini (iOS gibi) hem de IL'nin çalışma zamanında kullanılabilir olmadığını varsayması talimatı sağlar. Bu IL daha sonra derleme sonrası çıkarılmış olabilir. Yukarıda belirtildiği gibi, çalışma zamanı bazı yerlerde daha az iyileştirilmiş yordamlar kullanmaya zorlar.

Dikkat edilecek diğer konular

AOT ölçeğinin, işlenen derlemelerin boyutları ve sayısıyla 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, Kullanılmayan kodu çıkaran Tam hedef çerçevenin Bağlama ile uyumsuzluğuyla biriktir. En iyi sonuçlar için, uygulamanızı Modern'e taşımayı ve Bağlamayı etkinleştirmeyi göz önünde bulundurabilirsiniz.

AOT'nin bir diğer avantajı, yerel hata ayıklama ve profil oluşturma araçlıkları ile geliştirilmiş etkileşimlerle birlikte gelir. Kod tabanının büyük bir çoğunluğu zamanından önce derlen bire bir derleyenek, yerel kilitlenme raporları, profil oluşturma ve hata ayıklama içinde daha kolay okunan işlev adlarına ve sembollere sahip olacaktır. JIT tarafından oluşturulan işlevler bu adlara sahip değildir ve genellikle çözülmesi çok zor olan adsız altılık uzaklıklar olarak gösterir.