다음을 통해 공유


프로파일링 API의 코드 생성

이 항목에서는 네이티브 코드에 대한 MSIL(Microsoft Intermediate Language) 코드의 흐름과 프로파일러에서 코드 생성을 제어하는 방법에 대해 설명합니다.

자동 코드 생성과 수동 코드 생성

다음 두 가지 방법 중 하나로 .NET Framework 어셈블리의 MSIL을 네이티브 코드로 컴파일할 수 있습니다.

  • 수동 컴파일: 네이티브 이미지 생성기(NGen.exe) 도구를 사용하여 네이티브 이미지를 만들 수 있습니다.

  • 자동 컴파일: 런타임에 CLR(공용 언어 런타임)에서 JIT(Just-In-Time) 컴파일을 수행할 수 있습니다.

NGen.exe 및 JIT 컴파일러는 둘 다 코드 생성을 제어하는 플래그를 제공합니다.

어셈블리가 로드될 때 CLR에서는 먼저 어셈블리의 네이티브 이미지를 찾습니다. 올바른 코드 생성 플래그 집합이 있는 네이티브 이미지를 찾지 못하면 실행하는 동안 필요할 경우 CLR에서 어셈블리의 함수를 JIT 컴파일합니다. 네이티브 이미지를 찾아 로드해도 CLR에서 어셈블리의 일부 함수를 JIT 컴파일할 수 있습니다.

코드 생성에 대한 프로파일러 제어

프로파일러에서는 다음 표에 있는 플래그를 사용하여 코드 생성을 제어합니다.

플래그

결과

COR_PRF_USE_PROFILE_IMAGES

.NET Framework 버전 2.0이 필요합니다. 네이티브 이미지 검색에서 프로파일러 확장 이미지를 찾도록 합니다(ngen /profile). 검색에서 지정한 어셈블리의 프로파일러 확장 네이티브 이미지를 찾지 못하면 대신 CLR에서는 필요할 경우 해당 어셈블리의 메서드를 JIT 컴파일합니다.

JIT 컴파일된 코드에는 아무런 영향을 주지 않습니다.

COR_PRF_DISABLE_INLINING

네이티브 이미지 검색에는 아무런 영향을 주지 않습니다.

JIT 컴파일에서는 인라인을 사용하지 않습니다. 다른 최적화는 모두 계속 적용됩니다.

COR_PRF_DISABLE_OPTIMIZATIONS

네이티브 이미지 검색에는 아무런 영향을 주지 않습니다.

JIT 컴파일에서는 인라인을 비롯한 모든 최적화를 사용하지 않습니다.

COR_PRF_MONITOR_ENTERLEAVE

네이티브 이미지 검색에서 프로파일러 확장 이미지를 찾도록 합니다(ngen /profile).

JIT 컴파일에서는 생성된 코드에 enter/leave 후크를 삽입합니다.

COR_PRF_MONITOR_CODE_TRANSITIONS

네이티브 이미지 검색에서 프로파일러 확장 이미지를 찾도록 합니다(ngen /profile).

JIT 컴파일에서는 관리/비관리 전환 지점에 후크를 삽입합니다.

프로파일러 및 네이티브 이미지

NGen.exe에서 네이티브 이미지를 만들 때는 일반적으로 CLR에서 런타임에 수행하는 클래스 로드, 함수 컴파일 등의 많은 작업을 수행합니다. 따라서 네이티브 이미지를 만들 때 이러한 작업을 수행한 경우 런타임에 다음과 같은 프로파일러 콜백이 수신되지 않습니다.

프로파일러 확장 네이티브 이미지

NGen.exe를 사용하여 네이티브 이미지를 만들면 이미지를 프로파일링하기 쉽게 해주는 코드 생성 플래그 집합이 다음과 같이 설정됩니다.

성능 고려 사항

NGen 생성 응용 프로그램을 프로파일링하는 방법은 가져올 데이터와 포함된 프로파일링 후크가 응용 프로그램에 끼치는 영향에 따라 달라집니다.

이 단원의 앞부분에서 설명한 대로 다음 두 가지 기본 NGen 프로파일링 시나리오가 있습니다.

  • 보통 네이티브 이미지(프로파일링 후크를 사용하지 않는 NGen 생성 이미지): 이러한 이미지는 프로파일링 오버헤드를 유발하지 않습니다. 그러나 보통 네이티브 이미지에는 클래스 로드/언로드 콜백을 사용할 수 없습니다. 이 상황을 처리하려면 프로파일러 확장 네이티브 이미지를 요청하지 않을 프로파일러에서 ClassID를 발견하면 FunctionID에 대한 데이터를 수집해야 합니다. 예를 들어, 보통 NGen 생성 이미지에 대해서는 클래스 로드/언로드 콜백이 발생하지 않기 때문에 FunctionID가 처음 JIT 컴파일되거나 NGen 생성 이미지에서 로드될 때 샘플링 프로파일러에서 FunctionID가 발견되지 않습니다. 함수의 컴파일된 코드 본문의 IP(명령 포인터)에서 프로세스가 실행되었다는 것이 샘플에 표시되면 프로파일러가 나중에 FunctionID를 발견합니다. 이 경우 프로파일러는 샘플링하는 동안 함수에 대한 정보를 쿼리하거나, FunctionID 또는 연관된 메타데이터 토큰을 기록하여 나중에 쿼리할 수 있습니다. 따라서 ID가 처음 생성될 때 프로파일러는 그 전이 아니라 마지막으로 가능할 때만(ID가 실제로 사용된다는 것을 감지하는 경우) FunctionID 또는 ClassID에 대한 정보를 쿼리합니다.

  • 프로파일러 확장 네이티브 이미지(포함된 프로파일링 후크가 있는 NGen 생성 이미지): 이러한 이미지는 크기가 더 크며 보통 이미지와 현저히 다릅니다. 또한 프로파일러 후크를 포함하면 응용 프로그램의 동작이 달라질 수 있습니다. 따라서 성능과 동작 결과(오버헤드)에 문제가 없다고 판단될 경우에만 프로파일러 확장 네이티브 이미지를 사용해야 합니다.

참고 항목

개념

프로파일링 개요