ReadyToRun-fordítás

A .NET-alkalmazások indítási ideje és késése javítható az alkalmazásszerelvények ReadyToRun (R2R) formátumként való összeállításával. Az R2R az idő előtti fordítás (AOT) egyik formája.

Az R2R bináris fájljai úgy javítják az indítási teljesítményt, hogy csökkentik az igény szerinti (JIT) fordítónak az alkalmazás betöltésekor szükséges munkáját. A bináris fájlok hasonló natív kódot tartalmaznak, mint a JIT által előállított kód. Az R2R bináris fájlok azonban nagyobbak, mert mind a köztes nyelvi (IL) kódot tartalmazzák, amelyre bizonyos forgatókönyvek esetében még szükség van, és ugyanannak a kódnak a natív verzióját is tartalmazzák. Az R2R csak akkor érhető el, ha olyan alkalmazást tesz közzé, amely meghatározott futtatókörnyezeteket (RID- például Linux x64 vagy Windows x64) céloz meg.

A projekt ReadyToRunként való fordításához az alkalmazást közzé kell tenni a PublishReadyToRun tulajdonság beállításával true.

Az alkalmazást kétféleképpen teheti közzé ReadyToRun néven:

  1. Adja meg a PublishReadyToRun jelölőt közvetlenül a dotnet publish parancshoz. Részletekért lásd a dotnet közzétételi webhelyét .

    dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
    
  2. Adja meg a tulajdonságot a projektben.

    • Adja hozzá a <PublishReadyToRun> beállítást a projekthez.
    <PropertyGroup>
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    
    • Az alkalmazás közzététele speciális paraméterek nélkül.
    dotnet publish -c Release -r win-x64
    

A ReadyToRun szolgáltatás használatának hatása

Az előre összeállított összeállítás összetett hatással van az alkalmazás teljesítményére, ami nehezen megjósolható. Általánosságban elmondható, hogy a szerelvény mérete 2-3-szor nagyobb lesz. A fájl fizikai méretének növekedése csökkentheti a szerelvény lemezről való betöltésének teljesítményét, és növelheti a folyamat munkakészletét. Cserébe azonban a futásidőben lefordított metódusok száma általában jelentősen csökken. Ennek az az eredménye, hogy a nagy mennyiségű kóddal rendelkező alkalmazások többsége nagy teljesítménybeli előnyökkel jár a ReadyToRun engedélyezésével. A kis mennyiségű kóddal rendelkező alkalmazások valószínűleg nem fognak jelentős javulást tapasztalni a ReadyToRun engedélyezésében, mivel a .NET futtatókörnyezeti kódtárakat már előre összeállították a ReadyToRun használatával.

Az itt tárgyalt indítási fejlesztés nem csak az alkalmazás indítására vonatkozik, hanem az alkalmazás bármely kódjának első használatára is. A ReadyToRun használatával például csökkenthető a Webes API első használatának késése egy ASP.NET alkalmazásban.

Interakció a rétegzett fordítással

Az előre létrehozott kód nem annyira optimalizált, mint a JIT által előállított kód. A probléma megoldásához a rétegzett fordítás a gyakran használt ReadyToRun metódusokat jiT-alapú metódusok helyett használja.

Hogyan történik az előre összeállított szerelvények kiválasztása?

Az SDK előre lefordítja az alkalmazással elosztott szerelvényeket. Az önálló alkalmazások esetében ez a szerelvények a keretrendszert is tartalmazzák. A C++/CLI bináris fájlok nem jogosultak a ReadyToRun fordítására.

Ha bizonyos szerelvényeket ki szeretne zárni a ReadyToRun-feldolgozásból, használja a <PublishReadyToRunExclude> listát.

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

Hogyan van kiválasztva az előrefordítandó metódusok készlete?

A fordító megpróbálja előre lefordítani a lehető legtöbb metódust. Különböző okokból azonban nem várható, hogy a ReadyToRun funkció használata megakadályozza a JIT végrehajtását. Ilyen okok lehetnek többek között a következők:

  • A különálló szerelvényekben definiált általános típusok használata.
  • Interop natív kóddal.
  • Olyan hardveres belső elemek használata, amelyeket a fordító nem tud bizonyítani, biztonságosan használható a célszámítógépen.
  • Bizonyos szokatlan IL-minták.
  • Dinamikus metódus létrehozása tükröződés vagy LINQ használatával.

Szimbólumgenerálás profilkészítőkkel való használatra

Amikor egy alkalmazást a ReadyToRun használatával készít, a profilkészítőknek szimbólumokra lehet szükségük a létrehozott ReadyToRun-fájlok vizsgálatához. A szimbólumok létrehozásának engedélyezéséhez adja meg a tulajdonságot <PublishReadyToRunEmitSymbols> .

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

Ezek a szimbólumok a közzétételi könyvtárban lesznek elhelyezve, a Windows esetében pedig a .ni.pdb fájlkiterjesztéssel, Linux esetén pedig .r2rmap fájlkiterjesztéssel. Ezeket a fájlokat általában nem terjesztik újra a végfelhasználók számára, hanem általában egy szimbólumkiszolgálón tárolják őket. Ezek a szimbólumok általában hasznosak az alkalmazások indításával kapcsolatos teljesítményproblémák hibakereséséhez, mivel a rétegzett fordítás a ReadyToRun által létrehozott kódot dinamikusan generált kódra cseréli. Ha azonban olyan alkalmazást próbál profilba venni, amely letiltja a rétegzett fordítást , a szimbólumok hasznosak lesznek.

Összetett ReadyToRun

A Normál ReadyToRun-fordítás bináris fájlokat hoz létre, amelyek egyenként szervizelhetők és módosíthatók. A .NET 6-tól kezdve az összetett ReadyToRun-fordítás támogatása meg lett adva. Az Összetett ReadyToRun olyan szerelvényeket állít össze, amelyeket együtt kell elosztani. Ennek az az előnye, hogy a fordító képes jobb optimalizálásokat végezni, és csökkenti a ReadyToRun folyamaton keresztül nem fordítható metódusok készletét. Kompromisszumként azonban a fordítási sebesség jelentősen csökken, és az alkalmazás teljes fájlmérete jelentősen megnő. Ezen kompromisszumok miatt az Összetett ReadyToRun használata csak olyan alkalmazások esetében ajánlott, amelyek letiltják a rétegzett fordítást, vagy a Linuxon futó alkalmazások esetében, amelyek a legjobb indítási időt keresik az önálló üzembe helyezéssel. Az összetett ReadyToRun-fordítás engedélyezéséhez adja meg a tulajdonságot <PublishReadyToRunComposite> .

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

Feljegyzés

A .NET 6-ban az összetett ReadyToRun csak önálló üzembe helyezés esetén támogatott.

Platformfüggetlen/architektúra-korlátozások

Egyes SDK-platformok esetében a ReadyToRun fordító képes más célplatformok keresztfordítására.

A támogatott fordítási célokat az alábbi táblázatban ismertetjük a .NET 6-os és újabb verzióinak megcélzásakor.

SDK-platform Támogatott célplatformok
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)

A támogatott fordítási célokat az alábbi táblázatban ismertetjük a .NET 5-ös és az alatti célzáskor.

SDK-platform Támogatott célplatformok
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