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:
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
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 |