다음을 통해 공유


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

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

계층화된 컴파일

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