ReadyToRun Derlemesi

.NET uygulama başlatma süresi ve gecikme süresi, uygulama derlemelerinizi ReadyToRun (R2R) biçiminde derleyerek geliştirilebilir. R2R, önceden (AOT) derlemenin bir biçimidir.

R2R ikili dosyaları, uygulamanız yüklenirken tam zamanında (JIT) derleyicinin yapması gereken iş miktarını azaltarak başlangıç performansını artırır. İkili dosyalar, JIT'nin üreteceği kodla karşılaştırıldığında benzer yerel kod içerir. Ancak R2R ikili dosyaları, bazı senaryolar için hala gerekli olan ara dil (IL) kodunu ve 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ı (RID) hedefleyen bir uygulama yayımladığınızda kullanılabilir.

Projenizi ReadyToRun olarak derlemek için uygulamanın PublishReadyToRun özelliği olarak trueayarlanmış olarak 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 bölümüne 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ı herhangi bir özel parametre olmadan yayımlayın.
    dotnet publish -c Release -r win-x64
    

ReadyToRun özelliğini kullanmanın etkisi

Önceden derlemenin uygulama performansı üzerinde karmaşık bir performans etkisi vardır ve bu da tahmin edilmesi zor olabilir. Genel olarak, bir derlemenin boyutu iki ila üç kat daha büyük olacak. Dosyanın fiziksel boyutundaki bu artış, derlemeyi diskten yükleme performansını azaltabilir ve işlemin çalışma kümesini artırabilir. Ancak, çalışma zamanında derlenen yöntem sayısı genellikle önemli ölçüde azalır. Sonuç olarak, büyük miktarda koda sahip uygulamaların çoğu ReadyToRun'un etkinleştirilmesinden büyük performans avantajları elde eder. .NET çalışma zamanı kitaplıkları ReadyToRun ile önceden derlenmiş olduğundan, az miktarda koda sahip uygulamalar ReadyToRun'un etkinleştirilmesiyle ilgili önemli bir gelişme yaşamayacaktır.

Burada açıklanan başlatma iyileş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, ASP.NET bir uygulamada Web API'sinin ilk kullanımının yanıt gecikme süresini azaltmak için kullanılabilir.

Katmanlı derleme ile etkileşim

Önceden oluşturulan kod, JIT tarafından üretilen kod kadar iyileştirilmiş değildir. Bu sorunu gidermek için katmanlı derleme yaygın olarak kullanılan ReadyToRun yöntemlerini JIT tarafından oluşturulan yöntemlerle değiştirir.

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

SDK, uygulamayla dağıtılan derlemeleri önceden derleyecektir. Bağımsız uygulamalar için bu derleme kümesi çerçeveyi içerir. C++/CLI ikili dosyaları ReadyToRun derlemesi için uygun değildir.

Belirli derlemeleri ReadyToRun işleminin dışında tutmak için listeyi kullanın <PublishReadyToRunExclude> .

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

Önceden derlenen yöntem kümesi nasıl seçilir?

Derleyici, olabildiğince çok yöntemi önceden derlemeyi dener. Ancak çeşitli nedenlerle ReadyToRun özelliğini kullanmanın JIT'nin yürütülmesini engellemesi beklenmemektedir. Bu tür nedenler şunları içerebilir ancak bunlarla sınırlı değildir:

  • Ayrı derlemelerde tanımlanan genel türlerin kullanımı.
  • Yerel kodla birlikte çalışma.
  • Derleyicinin kanıtlayamayacağı donanım iç bileşenlerinin kullanılması hedef makinede güvenlidir.
  • Bazı olağan dışı IL desenleri.
  • Yansıma veya LINQ aracılığıyla dinamik yöntem oluşturma.

Profil oluşturucularla kullanmak 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 simgeler yayımlama dizinine yerleştirilir ve Windows için .ni.pdb dosya uzantısına ve Linux için .r2rmap dosya uzantısına sahip olur. Bu dosyalar genellikle son müşterilere yeniden dağıtılmaz, ancak bunun yerine genellikle bir sembol sunucusunda depolanır. Katmanlı Derleme ReadyToRun tarafından oluşturulan kodu dinamik olarak oluşturulan kodla değiştireceği için bu simgeler genellikle uygulamaların başlatılmasıyla ilgili performans sorunlarının hatalarını ayıklamak için yararlıdır. Ancak, Katmanlı Derleme'yi devre dışı bırakabilen bir uygulamanın profilinin çıkarılmaya çalışılması durumunda simgeler yararlı olacaktır.

Bileşik ReadyToRun

Normal ReadyToRun derlemesi, ayrı ayrı servis ve işleme alınabilen ikili dosyalar oluşturur. .NET 6'dan başlayarak Bileşik ReadyToRun derlemesi desteği eklendi. Bileşik ReadyToRun, birlikte dağıtılması gereken bir derleme kümesi derler. Bu, derleyicinin daha iyi iyileştirmeler yapabilmesi ve ReadyToRun işlemi aracılığıyla derlenemiyor yöntemlerin kümesini azaltma avantajına sahiptir. Ancak, sonuç olarak derleme hızı önemli ölçüde azalır ve uygulamanın genel dosya boyutu önemli ölçüde artar. Bu dengeler nedeniyle Bileşik ReadyToRun'un kullanılması yalnızca Katmanlı Derleme'yi devre dışı bırakmayan uygulamalar veya Linux üzerinde çalışan ve bağımsız dağıtım ile en iyi başlangıç zamanını arayan uygulamalar için önerilir. Bileşik ReadyToRun derlemesini <PublishReadyToRunComposite> etkinleştirmek için özelliğini belirtin.

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

Not

.NET 6'da Bileşik ReadyToRun yalnızca bağımsız 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 derleme yapabilir.

Desteklenen derleme hedefleri, .NET 6 ve sonraki sürümleri hedeflerken aşağıdaki tabloda açıklanmıştı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 altı 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