Sdílet prostřednictvím


Optimalizace a ladění JIT

Pokud se pokoušíte ladit kód, je jednodušší, když tento kód není optimalizovaný. Když je kód optimalizovaný, kompilátor a modul runtime změní v generovaném kódu procesoru, aby běžel rychleji, ale má méně přímé mapování na původní zdrojový kód. Pokud je mapování méně přímé, ladicí programy často nemůžou informovat o hodnotě místních proměnných a krokování kódu a zarážky nemusí fungovat podle očekávání.

Poznámka:

Další informace o ladění JIT (Just In Time) najdete v této dokumentaci.

Jak fungují optimalizace v .NET

Za normálních okolností konfigurace sestavení vydané verze vytvoří optimalizovaný kód a konfigurace sestavení ladění ne. Vlastnost Optimize MSBuild řídí, zda kompilátor je řečeno pro optimalizaci kódu.

V ekosystému .NET je kód převeden ze zdroje na instrukce procesoru v dvou krocích: nejprve kompilátor jazyka C#převede text, který zadáte, na zprostředkující binární formulář s názvem MSIL a zapíše jazyk MSIL do .dll souborů. Později modul runtime .NET převede tento modul MSIL na instrukce procesoru. Oba kroky se můžou optimalizovat do určité míry, ale druhý krok prováděný modulem runtime .NET provádí důležitější optimalizace.

Možnost Potlačit optimalizaci JIT při načítání modulu (jenom spravované)

Ladicí program zveřejňuje možnost, která řídí, co se stane, když je knihovna DLL kompilovaná s povolenými optimalizacemi zatížení uvnitř cílového procesu. Pokud tato možnost není zaškrtnutá (výchozí stav), pak když modul runtime .NET zkompiluje kód MSIL do kódu procesoru, ponechá optimalizace povolené. Pokud je tato možnost zaškrtnutá, ladicí program požaduje, aby optimalizace byly zakázány.

Pokud chcete najít možnost Potlačit optimalizaci JIT při načítání modulu (pouze spravované), vyberte Možnosti nástrojů>a pak vyberte stránku Obecné pod uzlem Ladění.

Potlačení optimalizace JIT

Kdy byste měli zkontrolovat možnost Potlačit optimalizaci JIT?

Tuto možnost zaškrtněte, když jste stáhli knihovny DLL z jiného zdroje, například z balíčku NuGet, a chcete ladit kód v této knihovně DLL. Aby potlačení fungovalo, musíte také najít soubor symbolu (PDB) pro tuto knihovnu DLL.

Pokud vás zajímá pouze ladění kódu, který vytváříte místně, je nejlepší nechat tuto možnost nezaškrtnutou, protože v některých případech povolení této možnosti výrazně zpomalí ladění. Toto zpomalení má dva důvody:

  • Optimalizovaný kód běží rychleji. Pokud vypnete optimalizace pro velké množství kódu, může to mít vliv na výkon.
  • Pokud máte povolený jenom můj kód, ladicí program se ani nepokusí načíst symboly pro knihovny DLL, které jsou optimalizované. Hledání symbolů může trvat dlouhou dobu.

Omezení možnosti Potlačit optimalizaci JIT

Existují dvě situace, kdy zapnutí této možnosti nebude fungovat:

  1. V situacích, kdy ladicí program připojujete k již běžícímu procesu, tato možnost nebude mít žádný vliv na moduly, které byly již načteny v době připojení ladicího programu.

  2. Tato možnost nemá žádný vliv na knihovny DLL, které byly předem zkompilovány (nebo ngen'ed) do nativního kódu. Použití předkompilovaného kódu ale můžete zakázat spuštěním procesu s proměnnou prostředí COMPlus_ReadyToRun nastavenou na hodnotu 0. To řekne modulu runtime .NET Core, aby zakázal použití předkompilovaných imagí a vynutil modul runtime kompilaci kódu architektury JIT.

    Pokud cílíte na rozhraní .NET Framework, přidejte proměnnou prostředí COMPlus_ZapDisable a nastavte ji na 1.

Nastavte "COMPlus_ReadyToRun": "0" ho tak, že ho přidáte do každého profilu v souboru Properties\launch Nastavení.json:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:59694/",
      "sslPort": 44320
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "COMPlus_ReadyToRun": "0"
      }
    },
    "HttpLoggingSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "COMPlus_ReadyToRun": "0"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    }
  }
}