프로필 기반 최적화

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

프로필 기반 최적화는 네이티브 대상인 x86, IPF(Itanium Processor Family) 또는 x64에 대해서만 사용할 수 있습니다. 공용 언어 런타임에서 실행되는 출력 파일에 대해서는 프로필 기반 최적화를 사용할 수 없습니다. /clr로 컴파일하여 네이티브 코드와 관리 코드가 혼합된 어셈블리를 생성하더라도 네이티브 코드에 대해서만 프로필 기반 최적화를 사용할 수는 없습니다.

참고

프로파일링 테스트 실행에서 수집되는 정보는 /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 코드를 별도의 섹션으로 옮길 수 있습니다.

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

자세한 내용은 연습: 프로필 기반 최적화 사용을 참조하십시오.

단원 내용

프로필 기반 최적화 도구

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

참고 항목

참조

C/C++ 빌드 도구