다음을 통해 공유


프로필 기반 최적화

프로필 기반 최적화를 사용하면 출력 파일을 최적화할 수 있습니다. 이 경우 최적화 프로그램에서는 .exe 또는 .dll 파일의 테스트 실행으로 얻은 데이터를 사용합니다.이 데이터는 프로덕션 환경에서 프로그램의 기능이 어느 정도로 수행되는지를 나타냅니다.

프로필 기반 최적화는 네이티브 대상인 x86, IPF(Itanium Processor Family) 또는 x64에 대해서만 사용할 수 있습니다.공용 언어 런타임에서 실행되는 출력 파일에 대해서는 프로필 기반 최적화를 사용할 수 없습니다./clr로 컴파일하여 네이티브 코드와 관리 코드가 혼합된 어셈블리를 생성하더라도 네이티브 코드에 대해서만 프로필 기반 최적화를 사용할 수는 없습니다.프로필 기반 최적화 Windows 저장소 응용 프로그램에 대해 지원 되지 않습니다.IDE에서 설정 이러한 옵션을 사용 하는 프로젝트를 빌드 하려는 경우 빌드 오류가 발생 합니다.

[!참고]

프로파일링 테스트 실행에서 수집되는 정보는 /Ob, /Os 또는 /Ot를 지정할 때 적용되는 최적화를 재정의합니다.자세한 내용은 /Ob(인라인 함수 확장)/Os, /Ot(크기 우선 코드, 속도 우선 코드)을 참조하십시오.

다음은 프로필 기반 최적화를 사용하는 과정에 대한 개요입니다.

  • /GL을 사용하여 소스 코드 파일을 하나 이상 컴파일합니다.

    프로필 기반 최적화 테스트를 실행할 때 /GL을 사용하여 빌드한 각 모듈을 검사하여 런타임 동작을 캡처할 수 있습니다.프로필 기반 최적화 빌드의 모든 모듈은 /GL을 사용하여 컴파일하지 않아도 됩니다.하지만 /GL을 사용하여 컴파일된 모듈만 계측되어 나중에 프로필 기반 최적화에 사용할 수 있습니다.

  • /LTCG:PGINSTRUMENT를 사용하여 링크합니다.

    /LTCG:PGINSTRUMENT는 빈 .pgd 파일을 만듭니다.테스트 실행 데이터가 .pgd 파일에 추가되면 이 파일을 다음 링크 단계(최적화된 이미지 만들기)에 대한 입력으로 사용할 수 있습니다./LTCG:PGINSTRUMENT를 지정할 때 선택에 따라서는 .pgd 파일의 사용자 지정 이름이나 위치와 함께 /PGD를 지정할 수도 있습니다.

  • 응용 프로그램을 프로파일링합니다.

    프로파일링된 EXE 세션이 끝나거나 프로파일링된 DLL이 언로드될 때마다 appname!#.pgc 파일이 작성됩니다..pgc 파일에는 특정 응용 프로그램 테스트 실행에 대한 정보가 포함됩니다.# 기호는 디렉터리의 다른 appname!#.pgc 파일 수를 기반으로 1부터 시작하여 증가하는 숫자입니다.테스트 실행 결과가 최적화하려는 시나리오를 나타내지 않으면 .pgc 파일을 삭제할 수 있습니다.

    테스트를 진행하는 동안 현재 열려 있는 .pgc 파일을 닫고 pgosweep 유틸리티를 사용하여 새 .pgc 파일을 만들 수 있습니다. 테스트 시나리오의 끝에서 응용 프로그램이 종료되지 않는 경우 등을 예로 들 수 있습니다.

    응용 프로그램을 프로파일링할 때 PogoSafeMode 옵션을 사용할 수 있습니다.이 옵션을 사용하여 응용 프로그램을 안전 모드에서 프로파일링할지 또는 고속 모드에서 프로파일링할지를 지정할 수 있습니다.이러한 모드에 대한 자세한 내용은 PogoSafeMode를 참조하십시오.

  • /LTCG:PGOPTIMIZE를 사용하여 링크합니다.

    /LTCG:PGOPTIMIZE는 최적화된 이미지를 만듭니다.이 단계에서는 .pgd 파일이 입력으로 사용됩니다.자세한 내용은 /LTCG:PGOPTIMIZE를 참조하십시오.

최적화된 출력 파일을 만들고 나중에 더 최적화된 이미지를 만들기 위한 프로파일링 작업이 추가로 필요한지 여부를 결정할 수도 있습니다.계측된 이미지와 해당 .pgd 파일을 사용할 수 있으면 테스트를 추가로 실행하고 최신 버전의 .pgd 파일을 사용하여 최적화된 이미지를 다시 빌드할 수 있습니다.

다음은 프로필 기반 최적화 기술들을 나열한 것입니다.

  • 인라이닝 - 예를 들어, 함수 B를 자주 호출하는 함수 A가 있고 함수 B가 상대적으로 작은 경우 프로필 기반 최적화에서는 함수 B를 함수 A에 인라이닝합니다.

  • 가상 호출 추론 - 함수 포인터를 통한 호출이나 가상 호출이 특정 함수를 주 대상으로 하는 경우 프로필 기반 최적화에서는 조건부로 실행되는 직접 호출을 주 대상 함수에 삽입하고 직접 호출을 인라이닝할 수 있습니다.

  • 레지스터 할당 – 프로필 데이터로 최적화하여 레지스터를 더 효율적으로 할당할 수 있습니다.

  • 기본 블록 최적화 – 기본 블록 최적화를 사용하면 특정 프레임 내에서 임시로 실행되는 일반적인 기본 실행 블록을 동일한 페이지 집합에 배치할 수 있습니다(집약성).이렇게 하면 사용되는 페이지 수를 최소화하여 메모리 오버헤드를 최소화할 수 있습니다.

  • 크기/속도 최적화 – 프로그램에서 자주 사용되는 함수의 속도를 최적화할 수 있습니다.

  • 함수 레이아웃 – 호출 그래프와 프로파일링된 호출자/호출 수신자 동작을 기반으로 동일한 실행 경로를 따르는 함수를 동일한 섹션에 배치합니다.

  • 조건부 분기 최적화 – 값 프로브를 통해 프로필 기반 최적화에서 switch 문에 주어진 값이 다른 값보다 자주 사용되는지 여부를 확인할 수 있습니다.그런 다음 이 값을 switch 문에서 꺼낼 수 있습니다.if/else 명령에 대해서도 동일한 작업을 수행할 수 있습니다. 이 경우 최적화 프로그램은 true 값이 더 자주 반환되는 블록을 기준으로 if 또는 else 블록을 먼저 배치하여 if/else의 순서를 지정할 수 있습니다.

  • 데드 코드 분리 – 프로파일링 과정에서 호출되지 않은 코드를 섹션 집합 끝에 추가된 별도의 섹션으로 옮깁니다.이렇게 하면 자주 사용되는 페이지와는 별도로 이 섹션을 유지할 수 있습니다.

  • EH 코드 분리 – 프로필 기반 최적화에서 예외가 예외 조건에서만 발생한다는 사실을 확인할 수 있는 경우 예외 조건에 따라 실행되는 EH 코드를 별도의 섹션으로 옮길 수 있습니다.

  • 메모리 내장 형식 – 내장 형식이 자주 호출되는지 확인할 수 있으면 내장 형식의 확장 여부를 더 합리적으로 결정할 수 있습니다.이동 또는 복사의 블록 크기를 기반으로 내장 형식을 최적화할 수도 있습니다.

자세한 내용은 Walkthrough: Using Profile-Guided Optimizations을 참조하십시오.

단원 내용

프로필 기반 최적화 도구

방법: 여러 개의 PGO 프로필을 단일 프로필로 병합

참고 항목

참조

C/C++ 빌드 도구