이 문서에서는 .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>
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET