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 optimalizován, kompilátor a modul runtime provádějí změny v kódu CPU, aby běžel rychleji, ale má méně přímý vztah k původnímu zdrojovému kódu. Pokud je mapování méně přímé, ladicí nástroje často nemohou ukázat hodnoty místních proměnných a krokování kódu a zarážky nemusí fungovat, jak byste očekávali.

Poznámka:

Další informace o ladění JIT (Just-In-Time) najdete v tématu Ladění pomocí ladicího programu Just-In-Time Debugger v sadě Visual Studio.

Jak fungují optimalizace v .NET

Obvykle konfigurace sestavení pro vydání vytvoří optimalizovaný kód, zatímco konfigurace sestavení pro ladění nikoli. Vlastnost Optimize MSBuild řídí, zda je kompilátor instruován k optimalizaci kódu.

V ekosystému .NET je kód převeden ze zdroje na instrukce procesoru v rámci dvoustupňového procesu: 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 (pouze spravováno)

Ladicí program nabízí možnost, která řídí, co se stane, když se knihovna DLL zkompilovaná s povolenými optimalizacemi načte do 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.

Možnost Potlačit optimalizaci JIT při načítání modulu (pouze spravované) můžete nakonfigurovat v podokně Nástroje>Možnosti v části Všechna nastavení>Obecné>Ladění:

Snímek obrazovky s možností Ladění zatížení modulu potlačit optimalizaci JIT

V dialogovém okně NástrojeMožnosti> můžete v části Obecné> nakonfigurovat možnost Potlačit optimalizaci JIT při načítání modulu (pouze spravované).

Potlačit optimalizaci JIT

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

Tuto možnost zaškrtněte při stahování knihoven DLL z jiného zdroje, například balíčku NuGet, a chcete ladit kód v této knihovně DLL. Aby potlačení fungovalo, musíte najít také soubor symbolů (.pdb) pro knihovnu DLL.

Pokud vás zajímá jenom 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ě zpomaluje ladění. 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 nepokouší načíst symboly pro knihovny DLL, které jsou optimalizované. Hledání symbolů může trvat dlouhou dobu.

Omezení funkce „Potlačit optimalizaci JIT“

Existují dva scénáře, kdy povolení této možnosti nefunguje :

  • Pokud ladicí program připojíte k již běžícímu procesu, tato možnost nemá žádný vliv na moduly, které jsou již načteny v době připojení ladicího programu.
  • Tato možnost nemá žádný vliv na předkompilované knihovny DLL (nebo ngen'ed) na nativní kód. 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. Tento přístup instruuje prostředí běhu .NET Core, aby zakázalo použití předkompilovaných obrazů, což vynutí JIT kompilaci kódu frameworku.

    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" tak, že ho přidáte do každého profilu v souboru Vlastnosti s\launchSettings.js:

{
  "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"
    }
  }
}