Kompilace ReadyToRun

Čas a latence aplikace .NET je možné vylepšit kompilací sestavení aplikace jako 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 kompilátor JIT (just-in-time) potřebuje 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 ale větší, protože obsahují kód zprostředkujícího jazyka (IL), který je stále potřeba pro některé scénáře, a nativní verzi stejného kódu. R2R je k dispozici pouze při publikování aplikace, která cílí na konkrétní prostředí runtime (RID), jako je Linux x64 nebo Windows x64.

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

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

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

    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. Tím se zvýší fyzická velikost souboru, může snížit výkon načítání sestavení z disku a zvýšit pracovní sadu procesu. Vracený počet metod kompilovaných za běhu se však obvykle výrazně snižuje. Výsledkem je, že většina aplikací, které mají velké objemy kódu, získají velké výhody výkonu při povolení ReadyToRunu. 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 s ReadyToRun.

Vylepšení spouštění probírané zde 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. Pokud chcete 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ředkompiluje sestavení distribuovaná s aplikací. Pro samostatné aplikace bude tato sada sestavení zahrnovat architekturu. Binární soubory C++/CLI nejsou způsobilé pro kompilaci ReadyToRun.

Pokud chcete 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ředkompilovat 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.
  • Některé neobvyklé vzory IL.
  • Dynamické vytváření metod prostřednictvím reflexe nebo LINQ

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

Při kompilaci aplikace s ReadyToRun mohou profilátory 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í kód vygenerovaný nástrojem 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. Složený ReadyToRun zkompiluje sadu sestavení, která se musí distribuovat společně. 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 se však rychlost kompilace výrazně sníží a celková velikost souboru aplikace se výrazně zvýší. Vzhledem k těmto kompromisům se použití složeného readytorunu doporučuje jenom pro aplikace, které zakažují vrstvené kompilace nebo aplikace spuštěné 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á sada ReadyToRun podporuje pouze pro samostatné nasazení.

Omezení pro různé platformy nebo architektury

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

Podporované cíle kompilace jsou popsané 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 popsané 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