컴파일을 위한 런타임 구성 옵션

이 문서에서는 .NET 컴파일을 구성하는 데 사용할 수 있는 설정을 자세히 살펴봅니다.

참고 항목

.NET 6은 .NET 런타임 동작을 구성하는 환경 변수에 대해 COMPlus_ 대신 접두사 DOTNET_을 표준화합니다. 그러나 COMPlus_ 접두사도 계속 작동합니다. 이전 버전의 .NET 런타임을 사용하는 경우에도 환경 변수에 COMPlus_ 접두사를 사용해야 합니다.

계층화된 컴파일

  • JIT(Just-In-Time) 컴파일러가 계층화된 컴파일을 사용하는지 여부를 구성합니다. 계층화된 컴파일은 두 계층을 통해 메서드를 전환합니다.
    • 첫 번째 계층은 코드를 더 빠르게 생성(빠른 JIT)하거나 미리 컴파일된 코드(ReadyToRun)를 로드합니다.
    • 두 번째 계층은 백그라운드에서 최적화된 코드를 생성합니다("JIT 최적화").
  • .NET Core 3.0 이상에서는 기본적으로 계층화된 컴파일이 사용하도록 설정됩니다.
  • .NET Core 2.1 및 2.2에서는 기본적으로 계층화된 컴파일이 사용하지 않도록 설정됩니다.
  • 자세한 내용은 계층화된 컴파일 가이드를 참조하세요.
설정 이름
runtimeconfig.json System.Runtime.TieredCompilation true - 사용
false - 사용 안 함
MSBuild 속성 TieredCompilation true - 사용
false - 사용 안 함
환경 변수 COMPlus_TieredCompilation 또는 DOTNET_TieredCompilation 1 - 사용
0 - 사용 안 함

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation": false
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Runtime.TieredCompilation": false
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredCompilation>false</TieredCompilation>
  </PropertyGroup>

</Project>

빠른 JIT

  • JIT 컴파일러가 빠른 JIT를 사용하는지 여부를 구성합니다. 루프를 포함되어 있지 않고 미리 컴파일된 코드를 사용할 수 없는 메서드의 경우 빠른 JIT는 최적화하지 않고도 빠르게 컴파일합니다.
  • 빠른 JIT를 사용하도록 설정하면 시작 시간이 단축되지만 성능 특성이 저하된 코드가 생성될 수 있습니다. 예를 들어 코드에서 더 많은 스택 공간을 사용하고, 더 많은 메모리를 할당하며 느리게 실행될 수 있습니다.
  • 빠른 JIT를 사용하지 않도록 설정하고 계층화된 컴파일을 사용하도록 설정한 경우에는 미리 컴파일된 코드만 계층화된 컴파일에 참여합니다. 메서드를 ReadyToRun으로 미리 컴파일하지 않은 경우 JIT 동작은 계층화된 컴파일이 사용하지 않도록 설정된 것과 같습니다.
  • .NET Core 3.0 이상에서는 기본적으로 빠른 JIT가 사용하도록 설정됩니다.
  • .NET Core 2.1 및 2.2에서는 기본적으로 빠른 JIT가 사용하지 않도록 설정됩니다.
설정 이름
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true - 사용
false - 사용 안 함
MSBuild 속성 TieredCompilationQuickJit true - 사용
false - 사용 안 함
환경 변수 COMPlus_TC_QuickJit 또는 DOTNET_TC_QuickJit 1 - 사용
0 - 사용 안 함

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation.QuickJit": false
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Runtime.TieredCompilation.QuickJit": false
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredCompilationQuickJit>false</TieredCompilationQuickJit>
  </PropertyGroup>

</Project>

루프에 대한 빠른 JIT

  • JIT 컴파일러가 루프를 포함하는 메서드에서 빠른 JIT를 사용할지 여부를 구성합니다.
  • 루프에 대한 빠른 JIT를 사용하도록 설정하면 시작 성능이 향상될 수 있습니다. 그러나 장기 실행 루프의 경우 오랜 기간 동안 덜 최적화된 코드에서 중단될 수 있습니다.
  • 빠른 JIT를 사용하지 않도록 설정한 경우에는 이 설정이 적용되지 않습니다.
  • 이 설정을 생략하면 루프를 포함하는 메서드에 대해 빠른 JIT가 사용되지 않습니다. 이는 값을 false으로 설정하는 것과 같습니다.
설정 이름
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false - 사용 안 함
true - 사용
MSBuild 속성 TieredCompilationQuickJitForLoops false - 사용 안 함
true - 사용
환경 변수 COMPlus_TC_QuickJitForLoops 또는 DOTNET_TC_QuickJitForLoops 0 - 사용 안 함
1 - 사용

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation.QuickJitForLoops": false
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Runtime.TieredCompilation.QuickJitForLoops": false
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
  </PropertyGroup>

</Project>

ReadyToRun

  • .NET Core 런타임이 사용 가능한 ReadyToRun 데이터가 포함된 이미지에 미리 컴파일된 코드를 사용하도록 할지 여부를 구성합니다. 이 옵션을 사용하지 않도록 설정하면 런타임에서 프레임워크 코드를 강제로 JIT 컴파일하게 합니다.
  • 자세한 내용은 실행 준비를 참조하세요.
  • 이 설정을 생략하면 .NET은 사용 가능한 경우 ReadyToRun 데이터를 사용합니다. 이는 값을 1으로 설정하는 것과 같습니다.
설정 이름
환경 변수 COMPlus_ReadyToRun 또는 DOTNET_ReadyToRun 1 - 사용
0 - 사용 안 함

프로필 기반 최적화

이 설정을 사용하면 .NET 6 이상 버전에서 동적(계층화된) PGO(프로필 기반 최적화)를 사용할 수 있습니다.

설정 이름
환경 변수 DOTNET_TieredPGO 1 - 사용
0 - 사용 안 함
MSBuild 속성 TieredPGO true - 사용
false - 사용 안 함

PGO(프로필 기반 최적화)는 JIT 컴파일러가 가장 자주 사용되는 형식 및 코드 경로 측면에서 최적화된 코드를 생성하는 곳입니다. 동적 PGO는 계층화된 컴파일과 함께 작동하여 계층 0 중에 배치되는 추가 계측에 따라 코드를 더욱 최적화합니다.

예제

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredPGO>true</TieredPGO>
  </PropertyGroup>

</Project>