0Pricing
C# Academy · Ders

ReadyToRun ve Katmanlı Derleme

.NET'te ReadyToRun ön derlemesini, katmanlı JIT derlemesini ve PGO'yu (profil yönlendirmeli optimizasyon) anlayın.

ReadyToRun ve Katmanlı Derleme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

JIT, R2R ve Katmanlı Derleme

.NET, başlangıç hızını en yüksek işlem hacmiyle dengelemek için çeşitli derleme stratejileri kullanır. JIT, ReadyToRun ve Katmanlı Derlemeyi anlamak, iş yükünüz için doğru ayarları seçmenize yardımcı olur.

JIT Nasıl Çalışır?

Derleyici Just-in-Time (JIT), her yöntemin ilk çağrıldığı anda IL bayt kodunu yerel makine koduna dönüştürür. Bu, ilk çağrıya gecikme ekler; ancak çalışan makine için yüksek düzeyde optimize edilmiş kod üretir.

// What happens at runtime:
// 1. App starts — methods are stubs pointing to the JIT
// 2. First call to MyMethod() → JIT compiles IL → native x64 code
// 3. Subsequent calls → native code runs directly (no JIT overhead)

// Startup cost: each method's first call takes microseconds for JIT
// Peak performance: excellent — JIT knows the actual CPU features

// .NET 9 JIT optimizations applied automatically:
// - Inlining
// - Loop unrolling
// - Escape analysis
// - SIMD vectorization
// - Profile-Guided Optimization (PGO)

ReadyToRun (R2R) Derlemesi

ReadyToRun (R2R), derlemelerinizi yayımlama zamanında önceden yerel koda derler. JIT çalışması zaten tamamlanmış olduğundan uygulama daha hızlı başlar; bunun karşılığında diskteki boyut büyür.

// Enable R2R in .csproj:
<PropertyGroup>
  <PublishReadyToRun>true</PublishReadyToRun>

  <!-- Optional: composite R2R — whole app in one native image -->
  <PublishReadyToRunComposite>true</PublishReadyToRunComposite>
</PropertyGroup>

// Publish:
dotnet publish -c Release -r linux-x64 --self-contained

// Benefits:
// - Startup time improvement: ~20-30% faster than JIT-only
// - No runtime required (self-contained)

// Trade-off:
// - Larger binary (IL + R2R code both stored)
// - Publish takes longer (cross-gen2 runs at publish time)

R2R ve Native AOT Karşılaştırması

R2R, yerel kodun yanında IL'yi de yayımlar ve hâlâ .NET çalışma zamanını gerektirir. Native AOT, IL'yi ve çalışma zamanını tamamen kaldırır. Dağıtım gereksinimlerinize göre seçim yapın.

// ReadyToRun:
// ✓ Still ships IL (fallback JIT for dynamically-generated code)
// ✓ Supports full reflection
// ✓ .NET runtime required on target
// ✓ Startup: ~30% faster than JIT
// Size: medium (IL + native)

// Native AOT:
// ✓ No IL, no runtime needed on target
// ✓ Startup: ~36x faster than JIT
// ✗ No reflection (must use source generators)
// ✗ Trimming limitations
// Size: smallest

// JIT only:
// ✓ Full reflection, no limitations
// ✓ Best peak throughput via PGO
// ✗ Slowest startup

Katmanlı Derleme

Katmanlı Derleme, .NET'te varsayılan olarak etkindir. Yöntemler Katman 0'da (hızlı derleme) başlar ve sık kullanılan yöntemler arka planda Katman 1'de (tam optimizasyon) yeniden derlenir.

// Tiered compilation lifecycle:
// Tier 0: fast JIT with minimal optimization
//   → method is callable in ~100 microseconds
// After ~30 calls (configurable): marked as "hot"
// Tier 1: full JIT with all optimizations + PGO
//   → background thread re-compiles the method
//   → future calls use optimized native code

// Usually transparent — you don't need to configure it
// Disable (rarely needed, only for debugging JIT issues):
// DOTNET_TieredCompilation=0

// Disable tiered PGO if benchmarking:
// DOTNET_TieredPGO=0

Profil Kılavuzlu Optimizasyon (PGO)

.NET 8 ve sonraki sürümler Dynamic PGO'yu varsayılan olarak içerir. Çalışma zamanı, çağrı profili verilerini Katman 0'da toplar ve ardından bu profili kullanarak sık kullanılan yollar için yüksek düzeyde özelleştirilmiş Katman 1 kodu oluşturur.

// PGO automatically specializes code like:

// Before PGO (generic virtual dispatch):
void Process(IAnimal animal) => animal.Speak();
// → runtime checks type on every call

// After PGO (type-specialized inline):
void Process(IAnimal animal)
{
    if (animal is Dog)     { /* inlined Dog.Speak() */ }
    else if (animal is Cat){ /* inlined Cat.Speak() */ }
    else animal.Speak();   // slow path
}

// Enabled by default in .NET 8+
// Verify:
// DOTNET_ReadyToRun=0
// DOTNET_TieredCompilation=1  (default)
// DOTNET_TieredPGO=1          (default .NET 8+)

Başlangıç Kancaları

Başlangıç kancaları (DOTNET_STARTUP_HOOKS), Main çalışmadan önce kod eklemenizi sağlar; uygulama kodunu değiştirmeden tanılama, yapılandırma geçersiz kılmaları veya araçlandırma için kullanışlıdır.

// Create a hook class:
public class StartupHook
{
    public static void Initialize()
    {
        Console.WriteLine("[StartupHook] Initializing before Main");
        // e.g., register telemetry, inject config overrides
        Environment.SetEnvironmentVariable("FEATURE_FLAG", "1");
    }
}

// Compile to a DLL and set the env var:
export DOTNET_STARTUP_HOOKS=/path/to/MyHook.dll

// Then run your app normally:
dotnet run
// [StartupHook] Initializing before Main
// [Your App Output]

Çalışma Zamanı Yapılandırma Ayarları

.NET çalışma zamanı, kod değişikliği yapmadan GC, iş parçacığı havuzu ve JIT davranışını ayarlamanız için ortam değişkenleri ve runtimeconfig.json ayarları sunar.

// runtimeconfig.template.json (baked into app at publish):
{
  "configProperties": {
    "System.GC.Server": true,           // server GC (multi-core)
    "System.GC.Concurrent": true,       // background GC
    "System.GC.HeapHardLimit": 536870912, // 512 MB hard limit
    "System.Threading.ThreadPool.MinThreads": 20,
    "System.Threading.ThreadPool.MaxThreads": 200,
    "System.Runtime.TieredCompilation": true
  }
}

// Environment variable overrides (useful in containers):
// DOTNET_GCHeapHardLimit=536870912
// DOTNET_ThreadPool_UnfairSemaphoreSpinLimit=70
// DOTNET_GCConserve=1  // reduce memory at cost of throughput

Crossgen2 ve Birleşik Görüntüler

Crossgen2, R2R görüntüleri üreten araçtır. Birleşik R2R, en iyi başlangıç performansını sağlamak için uygulamanın tamamını (uygulama ve çerçeve) tek bir paylaşılan yerel görüntüde önceden derler.

// Composite R2R: compile app + framework into one native image
<PropertyGroup>
  <PublishReadyToRun>true</PublishReadyToRun>
  <PublishReadyToRunComposite>true</PublishReadyToRunComposite>
</PropertyGroup>

// Normal R2R includes multiple images per assembly
// Composite merges them → fewer file reads at startup

// Manual crossgen2 invocation:
dotnet tool install -g dotnet-crossgen2
crossgen2 \
  --composite \
  --out composite.dll \
  MyApp.dll framework/System.Runtime.dll

// Inspect R2R content:
dotnet-ildasm --methodheader MyApp.dll | grep --color R2R

Gerçek Dünya: ASP.NET Core Başlangıcını Ayarlama

Üretim ortamındaki bir ASP.NET Core hizmetinde başlangıç performansını en üst düzeye çıkarmaya yönelik pratik ayarların kontrol listesi.

// .csproj:
<PublishReadyToRun>true</PublishReadyToRun>  // pre-JIT at publish
<PublishReadyToRunComposite>true</PublishReadyToRunComposite>
<TieredCompilation>true</TieredCompilation>   // default

// Program.cs — avoid startup work:
// ✓ Use AddHealthChecks() NOT AddDbContextCheck() for faster probe
// ✓ Lazy-initialize expensive singletons
// ✓ Don't await long tasks in Program.cs before app.Run()

// Container settings:
// DOTNET_GCServer=1             → server GC for multi-core pods
// DOTNET_GCHeapHardLimit=536870912 → prevent OOM in constrained pods
// DOTNET_ThreadPool_MinThreads=20  → reduce thread starvation under burst load

// Measure startup:
// app.MapGet("/startup-time",
//   () => $"Ready in: {Stopwatch.GetElapsedTime(startTimestamp).TotalMs}ms");

Hızlı Kontrol

ReadyToRun (R2R) ile Native AOT arasındaki temel fark nedir?

Özet: ReadyToRun ve Katmanlı Derleme

Temel çıkarımlar:

  • Katmanlı Derleme: .NET'te varsayılandır — Katman 0 (hızlı derleme) → Katman 1 (optimize edilmiş ve PGO uygulanmış)
  • Dynamic PGO: .NET 8 ve sonraki sürümlerde varsayılandır — çalışma zamanı sık kullanılan yolların profilini çıkarır ve Katman 1 kodunu özelleştirir
  • ReadyToRun: yayımlama sırasında önceden derler; başlangıcı yaklaşık %30 hızlandırır; çalışma zamanını hâlâ gerektirir; yansımayı destekler
  • Native AOT: IL ve çalışma zamanı yoktur; başlangıç yaklaşık 36 kat daha hızlıdır; yansıma yoktur; en küçük ikili dosyayı üretir
  • runtimeconfig.json ve ortam değişkenleriyle ayarlayın (GC, iş parçacığı havuzu, JIT ayarları)
  • Birleşik R2R, en iyi başlangıç performansı için uygulamayı ve çerçeveyi tek bir yerel görüntüde birleştirir

Sıkça Sorulan Sorular

“ReadyToRun ve Katmanlı Derleme” dersi ücretsiz mi?

Evet — “ReadyToRun ve Katmanlı Derleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“ReadyToRun ve Katmanlı Derleme” dersinde ne öğreneceğim?

.NET'te ReadyToRun ön derlemesini, katmanlı JIT derlemesini ve PGO'yu (profil yönlendirmeli optimizasyon) anlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“ReadyToRun ve Katmanlı Derleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Native AOT Derlemesi
  2. Kırpma ve Yansıma Sınırlamaları
  3. ReadyToRun ve Katmanlı Derleme
  4. BenchmarkDotNet ile Kıyaslama
← C# Academy Sayfasına Dön