Kompilace ReadyToRun

Čas a latence spuštění aplikace .NET lze vylepšit kompilací sestavení aplikace ve formátu ReadyToRun (R2R). R2R je forma předběžné kompilace (AOT).

Binární soubory R2R zlepšují výkon spouštění snížením množství práce, kterou musí kompilátor JIT (just-in-time) provést při načítání vaší aplikace. Binární soubory obsahují podobný nativní kód ve srovnání s tím, co by jiT vytvořilo. Binární soubory R2R jsou však větší, protože obsahují kód jazyka IL (Intermediate Language), který je stále nutný pro některé scénáře, a nativní verzi stejného kódu. R2R je k dispozici pouze v případě, že publikujete aplikaci, která cílí na konkrétní běhová prostředí (RID), jako je Linux x64 nebo Windows x64.

Chcete-li zkompilovat projekt jako ReadyToRun, musí být aplikace publikována s PublishReadyToRun vlastnost nastavena na true.

Aplikaci můžete publikovat jako ReadyToRun dvěma způsoby:

  1. Zadejte příznak PublishReadyToRun přímo dotnet publish příkazu. Podrobnosti najdete v tématu publikování dotnet.

    dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
    
  2. Zadejte vlastnost v projektu.

    • <PublishReadyToRun> Přidejte nastavení do projektu.
    <PropertyGroup>
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    
    • Publikujte aplikaci bez jakýchkoli speciálních parametrů.
    dotnet publish -c Release -r win-x64
    

Dopad použití funkce ReadyToRun

Kompilace předem má složitý dopad na výkon aplikace, což může být obtížné předpovědět. Obecně platí, že velikost sestavení se zvětší mezi dvěma až třikrát většími. Toto zvýšení fyzické velikosti souboru může snížit výkon načítání sestavení z disku a zvýšit pracovní sadu procesu. Ve vráceném počtu metod zkompilovaných za běhu se však obvykle podstatně snižuje. Výsledkem je, že většina aplikací, které mají velké objemy kódu, získají výhody velkého výkonu od povolení ReadyToRun. Aplikace, které mají malé množství kódu, pravděpodobně nebudou mít významné zlepšení povolení ReadyToRun, protože knihovny modulu runtime .NET již byly předkompilovány pomocí ReadyToRun.

Zde probírané vylepšení spouštění platí nejen pro spuštění aplikace, ale také pro první použití jakéhokoli kódu v aplikaci. Například ReadyToRun lze použít ke snížení latence odpovědi prvního použití webového rozhraní API v aplikaci ASP.NET.

Interakce s vrstvenou kompilací

Předem vygenerovaný kód není tak vysoce optimalizovaný jako kód vytvořený JIT. Chcete-li tento problém vyřešit, vrstvené kompilace nahradí běžně používané metody ReadyToRun metodami generovanými JIT.

Jak je zvolena sada předkompilovaných sestavení?

Sada SDK předkompiuluje sestavení distribuovaná s aplikací. Pro samostatné aplikace bude tato sada sestavení obsahovat architekturu. Binární soubory C++/CLI nemají nárok na kompilaci ReadyToRun.

Chcete-li vyloučit konkrétní sestavení ze zpracování ReadyToRun, použijte <PublishReadyToRunExclude> seznam.

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

Jak je zvolena sada metod předkompilování?

Kompilátor se pokusí předem zkompilovat tolik metod, kolik může. Z různých důvodů se ale neočekává, že použití funkce ReadyToRun zabrání spuštění JIT. Tyto důvody mohou zahrnovat, ale nejsou omezeny na:

  • Použití obecných typů definovaných v samostatných sestaveních
  • Spolupráce s nativním kódem
  • Použití hardwarových vnitřních objektů, které kompilátor nemůže prokázat, jsou bezpečné pro použití na cílovém počítači.
  • Určité neobvyklé vzory IL.
  • Dynamické vytváření metod pomocí reflexe nebo LINQ

Generování symbolů pro použití s profilátory

Při kompilaci aplikace pomocí ReadyToRun mohou profilátoři vyžadovat symboly pro zkoumání vygenerovaných souborů ReadyToRun. Pokud chcete povolit generování symbolů <PublishReadyToRunEmitSymbols> , zadejte vlastnost.

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

Tyto symboly budou umístěny v adresáři publikování a pro Windows budou mít příponu souboru .ni.pdb a pro Linux bude mít příponu souboru .r2rmap. Tyto soubory nejsou obecně redistribuovány koncovým zákazníkům, ale místo toho by se obvykle ukládaly na server symbolů. Obecně platí, že tyto symboly jsou užitečné pro ladění problémů s výkonem souvisejících se spouštěním aplikací, protože vrstvené kompilace nahradí vygenerovaný kód ReadyToRun dynamicky vygenerovaným kódem. Pokud se ale pokusíte profilovat aplikaci, která zakáže vrstvení kompilace , budou symboly užitečné.

Složené readytorun

Normální kompilace ReadyToRun vytváří binární soubory, které lze obsluhovat a manipulovat jednotlivě. Od verze .NET 6 byla přidána podpora kompilace Composite ReadyToRun. Composite ReadyToRun zkompiluje sadu sestavení, která musí být distribuována dohromady. To má výhodu, že kompilátor dokáže provádět lepší optimalizace a snižuje sadu metod, které nelze zkompilovat prostřednictvím procesu ReadyToRun. Jako kompromis je však rychlost kompilace výrazně snížena a celková velikost souboru aplikace je výrazně zvýšena. Vzhledem k těmto kompromisům se použití composite ReadyToRun doporučuje pouze pro aplikace, které zakazují vrstvené kompilace nebo aplikace běžící v Linuxu, které hledají nejlepší čas spuštění s vlastním nasazením. Chcete-li povolit složenou kompilaci ReadyToRun, zadejte <PublishReadyToRunComposite> vlastnost.

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

Poznámka:

V .NET 6 se složené readytorun podporuje jenom pro samostatné nasazení.

Omezení pro různé platformy nebo architekturu

U některých platforem sady SDK je kompilátor ReadyToRun schopný křížově kompilovat pro jiné cílové platformy.

Podporované cíle kompilace jsou popsány v následující tabulce při cílení na .NET 6 a novější verze.

Platforma SADY SDK Podporované cílové platformy
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)

Podporované cíle kompilace jsou popsány v následující tabulce při cílení na .NET 5 a níže.

Platforma SADY SDK Podporované cílové platformy
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