ReadyToRun derlemesi

.NET uygulama başlangıç süresi ve gecikme süresi, uygulama derlemeleriniz ReadyToRun (R2R) biçimi olarak derlenerek artırılabilir. R2R, bir süre öncesi (AOT) derleme biçimidir.

R2R ikilileri, tam zamanında (JıT) derleyicisinin uygulamanız yüklenirken yapması gereken iş miktarını azaltarak başlangıç performansını geliştirir. İkililer, JıT 'in üretmesine kıyasla benzer yerel kod içerir. Ancak, R2R ikilileri, bazı senaryolar için hala gerekli olan hem ara dil (IL) kodunu hem de aynı kodun yerel sürümünü içerdiğinden, daha büyüktür. R2R yalnızca Linux x64 veya Windows x64 gibi belirli çalışma zamanı ortamlarını (rıd) hedefleyen bir uygulama yayımladığınızda kullanılabilir.

Projenizi ReadyToRun olarak derlemek için, uygulamanın PublishReadyToRun özelliği olarak ayarlanmış true şekilde yayımlanması gerekir.

Uygulamanızı ReadyToRun olarak yayımlamanın iki yolu vardır:

  1. PublishReadyToRun bayrağını doğrudan dotnet publish komutuna belirtin. Ayrıntılar için DotNet Publish bakın.

    dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
    
  2. Projede özelliğini belirtin.

    • <PublishReadyToRun>Ayarı projenize ekleyin.
    <PropertyGroup>
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    
    • Uygulamayı özel parametre olmadan yayımlayın.
    dotnet publish -c Release -r win-x64
    

ReadyToRun özelliğini kullanmanın etkileri

Güncel derleme, uygulama performansı üzerinde karmaşık performans etkilerine sahiptir ve bu da tahmin etmek zor olabilir. Genel olarak, bir derlemenin boyutu iki ila üç kat daha büyük olacak şekilde artar. Dosyanın fiziksel boyutundaki bu artış, derlemeyi diskten yükleme performansını azaltabilir ve işlemin çalışma kümesini artırabilir. Ancak, dönüş sırasında, çalışma zamanında derlenen yöntemlerin sayısı genellikle önemli ölçüde azaltılır. Sonuç olarak, büyük miktarlarda koda sahip uygulamaların, ReadyToRun 'ı etkinleştirmesinin büyük performans avantajları vardır. .NET çalışma zamanı kitaplıkları zaten ReadyToRun ile önceden derlenmiş olduğundan, az miktarda koda sahip uygulamalar, ReadyToRun 'ı etkinleştirmenin önemli bir geliştirmesini yaşmaz.

Burada açıklanan başlangıç geliştirmesi yalnızca uygulama başlatma için değil, aynı zamanda uygulamadaki herhangi bir kodun ilk kullanımı için de geçerlidir. örneğin, readytorun, bir ASP.NET uygulamasında Web apı 'sinin ilk kullanımı için yanıt gecikmesini azaltmak üzere kullanılabilir.

Katmanlı derleme ile etkileşim

Önceden oluşturulan kod, JıT tarafından oluşturulan kod olarak yüksek oranda iyileştirilmemiştir. Bu sorunu gidermek için katmanlı derleme yaygın olarak kullanılan ReadyToRun yöntemlerini JıT tarafından oluşturulan yöntemlerle değiştirecektir.

Önceden derlenmiş derlemeler kümesi nasıl seçilir?

SDK, uygulamayla dağıtılan derlemeleri önceden derler. Kendi içinde bulunan uygulamalar için, bu derleme kümesi Framework 'ü içerir. C++/CLı ikilileri, ReadyToRun derlemesi için uygun değildir.

Belirli derlemeleri ReadyToRun işleminden dışlamak için listeyi kullanın <PublishReadyToRunExclude> .

<ItemGroup>
  <PublishReadyToRunExclude Include="Contoso.Example.dll" />
</ItemGroup>

Nasıl önceden derlenecek yöntemler kümesi seçildi?

Derleyici, mümkün olduğunca çok metodu önceden derlemeye çalışır. Bununla birlikte, çeşitli nedenlerle ReadyToRun özelliğinin kullanılması JıT 'in yürütülmesini engelleyecek şekilde beklenmez. Bu nedenlerden bazıları şunlar olabilir ancak bunlarla sınırlı değildir:

  • Ayrı derlemelerde tanımlanmış genel türlerin kullanımı.
  • Yerel kodla birlikte çalışma.
  • Derleyicinin bir hedef makinede kullanımı kanıtlayamadığını donanım iç bilgileri kullanımı.
  • Belirli olağandışı Il desenleri.
  • Yansıma veya LINQ aracılığıyla dinamik yöntem oluşturma.

Profil oluşturucular ile kullanım için sembol oluşturma

Bir uygulamayı ReadyToRun ile derlerken, profil oluşturucular oluşturulan ReadyToRun dosyalarını incelemek için semboller gerektirebilir. Sembol oluşturmayı etkinleştirmek için özelliğini belirtin <PublishReadyToRunEmitSymbols> .

<PropertyGroup>
  <PublishReadyToRunEmitSymbols>true</PublishReadyToRunEmitSymbols>
</PropertyGroup>

bu semboller publish dizinine yerleştirilecek ve Windows için. nı. pdb dosya uzantısı olacak ve Linux için. r2rmap dosya uzantısına sahip olacaktır. Bu dosyalar genellikle son müşterilere yeniden dağıtılır, ancak bunun yerine genellikle bir sembol sunucusunda depolanır. Genel olarak bu semboller, uygulamaların başlatılması ile ilgili performans sorunlarını ayıklamak için faydalıdır. katmanlı derleme , ReadyToRun tarafından üretilen kodu dinamik olarak oluşturulan kodla değiştirecek. Ancak, katmanlı derlemeyi devre dışı bırakan bir uygulamayı profil oluşturmaya çalıştığınızda semboller yararlı olacaktır.

Bileşik ReadyToRun

Normal ReadyToRun derlemesi, tek tek hizmet verilebilen ve yönetilebilen ikili dosyalar üretir. .NET 6 ' dan başlayarak bileşik ReadyToRun derlemesi desteği eklenmiştir. Bileşik ReadyToRun, birlikte dağıtılması gereken derlemelerin bir kümesini derler. Bu, derleyicinin daha iyi iyileştirmeler gerçekleştirebilmesinden ve ReadyToRun işlemi aracılığıyla Derlenemeyen yöntemlerin kümesini azalttığından yararlanır. Ancak, bir zorunluluğunu getirir olarak, derleme hızı önemli ölçüde azalır ve uygulamanın genel dosya boyutu önemli ölçüde artar. Bu uzlamalarda, bileşik ReadyToRun kullanımı yalnızca, Şirket içinde çalışan ve en iyi başlangıç süresini arayan ve Linux üzerinde çalışan uygulamaları devre dışı bırakan uygulamalar için önerilir. Bileşik ReadyToRun derlemesini etkinleştirmek için özelliğini belirtin <PublishReadyToRunComposite> .

<PropertyGroup>
  <PublishReadyToRunComposite>true</PublishReadyToRunComposite>
</PropertyGroup>

Not

.NET 6 ' da bileşik ReadyToRun yalnızca kendi içindeki dağıtım için desteklenir.

Platformlar arası/mimari kısıtlamaları

Bazı SDK platformları için, ReadyToRun derleyicisi diğer hedef platformlar için çapraz derlenebilecek bir derlemedir.

Desteklenen derleme hedefleri, .NET 6 ve sonraki sürümleri hedeflenirken aşağıdaki tabloda açıklanmaktadır.

SDK Platformu Desteklenen hedef platformlar
Windows X64 Windows (X86, X64, ARM64), Linux (x64, ARM32, ARM64), macos (x64, ARM64)
Windows X86 Windows (X86), Linux (ARM32)
Linux X64 Linux (x64, ARM32, ARM64), macOS (x64, ARM64)
Linux ARM32 Linux ARM32
Linux ARM64 Linux (x64, ARM32, ARM64), macOS (x64, ARM64)
macOS x64 Linux (x64, ARM32, ARM64), macOS (x64, ARM64)
macOS ARM64 Linux (x64, ARM32, ARM64), macOS (x64, ARM64)

Desteklenen derleme hedefleri, .NET 5 ve daha düşük bir sürüm hedeflenirken aşağıdaki tabloda açıklanmıştır.

SDK Platformu Desteklenen hedef platformlar
Windows X64 Windows X86, Windows X64, Windows ARM64
Windows X86 Windows X86, Windows ARM32
Linux X64 Linux x86, Linux x64, Linux ARM32, Linux ARM64
Linux ARM32 Linux ARM32
Linux ARM64 Linux ARM64
macOS x64 macOS x64