연습: 프로필 기반 최적화 사용

업데이트: 2007년 11월

이 연습에서는 Visual Studio IDE(통합 개발 환경)에서 PGO 빌드 메뉴를 사용한 간단한 구현 시나리오를 비롯하여 사용자 지정 구성이 필요한 고급 시나리오에 이르기까지 다양한 시나리오에서 PGO(프로필 기반 최적화)를 사용하는 방법을 보여 줍니다. 이 연습에서는 PGO 명령줄 도구를 사용하여 프로파일링 데이터의 수집 및 병합 과정을 사용자 지정하는 고급 기술에 대해서도 설명합니다. 자세한 내용은 프로필 기반 최적화를 참조하십시오.

PGO를 사용하는 응용 프로그램 만들기

이 예제 시나리오에서는 PGO를 사용하는 간단한 응용 프로그램을 만드는 방법을 설명합니다.

IDE에서 PGO를 사용하여 만들기

프로필 기반 최적화는 모든 네이티브 Visual C++ 프로젝트에 적용할 수 있습니다. 다음 절차에서는 Win32 응용 프로그램과 함께 PGO를 사용하는 방법을 보여 줍니다.

Win32 프로젝트를 만들려면

  1. 파일 메뉴에서 새로 만들기를 선택한 다음 프로젝트를 선택합니다. 새 프로젝트 대화 상자가 나타납니다.

  2. 프로젝트 형식 창에서 Visual C++ 노드를 선택한 다음 템플릿 창에서 Win32 프로젝트를 선택합니다.

  3. 이름 상자에 PGODemo를 입력합니다.

  4. 확인 단추를 클릭합니다. Win32 응용 프로그램 마법사가 나타납니다.

  5. 모든 기본 설정을 그대로 두고 마침 단추를 클릭합니다.

PGO를 사용하여 PGODemo 프로젝트를 빌드하려면

  1. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 Release 구성을 선택합니다.

  2. 솔루션 탐색기에서 PGODemo 프로젝트 노드를 마우스 오른쪽 단추로 클릭합니다. 프로젝트 컨텍스트 메뉴에서 프로필 기반 최적화를 선택한 다음 계측 메뉴 항목을 선택합니다.

  3. 솔루션 탐색기에서 PGODemo 프로젝트 노드를 마우스 오른쪽 단추로 클릭합니다. 프로젝트 컨텍스트 메뉴에서 프로필 기반 최적화를 선택한 다음 계측된/최적화된 응용 프로그램 실행을 선택하여 응용 프로그램을 실행합니다.

    참고:

    디버그 메뉴에서 시작이나 디버깅하지 않고 시작을 선택하여 계측 응용 프로그램을 시작할 수도 있습니다.

  4. 여러 시나리오를 사용하면서 3단계를 반복하여 계측 응용 프로그램을 훈련시킵니다. 계측 응용 프로그램이 종료되면 프로젝트 출력 디렉터리에 해당 실행에 대한 프로필 데이터가 들어 있는 .PGC 파일이 생성됩니다.

  5. 솔루션 탐색기에서 PGODemo 프로젝트 노드를 마우스 오른쪽 단추로 클릭합니다. 프로젝트 컨텍스트 메뉴에서 프로필 기반 최적화를 선택한 다음 최적화를 선택합니다.

명령줄에서 PGO를 사용하여 빌드

S1부터 Sn까지의 소스 파일에서 PGO 최적화를 사용하여 myapp.exe라는 응용 프로그램을 빌드하려는 경우를 가정합니다. 첫 단계로 S1부터 Sn까지의 소스 파일을 /GL 컴파일러 옵션을 사용하여 컴파일해야 합니다.

또한 필요에 맞는 최적화 옵션을 지정해야 합니다. 여기서는 /O2 옵션을 사용한다고 가정합니다. PGO를 사용하여 응용 프로그램을 빌드할 때 최적화 옵션을 지정하지 않으면, 즉 /Od를 사용하면 경고가 발생하고 컴파일러가 LTCG에 대한 빌드로 자동 전환됩니다. 첫 단계로 명령줄에 다음과 같이 입력합니다.

/GL을 사용하여 소스 파일을 컴파일하려면

  1. cl.exe /c /GL /O2 S1.cpp … Sn.cpp

  2. link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe

2단계에서는 PGO 계측 이미지인 myapp.exe를 생성하고, 컴파일러에서 최종 최적화 myapp.exe를 빌드하는 데 사용할 프로필 데이터베이스 파일인 myapp.pgd도 생성합니다. .pgd 파일의 기본 이름은 응용 프로그램의 이름과 같고 기본 경로는 출력 경로와 같습니다.

응용 프로그램에 대해 생성되는 .pgd 파일의 기본 이름을 변경하려면 이전 단계에서 /pgd 링커 옵션을 사용합니다. /pgd는 다음과 같이 사용할 수 있습니다.

/LTCG:PGI 및 /PGD를 사용하여 계측 이미지를 만들려면

  • link /ltcg:pgi /pgd:mypgd.pgd S1.obj … Sn.obj /out:myapp.exe

이제 계측된 myapp.exe를 사용자의 프로파일링 시나리오를 사용하여 훈련시킬 수 있습니다. 시나리오 실행을 마치면 각 실행에 대해 .pgc 파일이 생성된 것을 알 수 있습니다.

참고:

myapp.exe의 이미지를 동일한 경로에서 동시에 두 개 이상 실행하면, .pgc 파일은 모든 이미지에 대해 하나만 생성되며 모든 인스턴스가 종료된 이후에만 디스크에 기록됩니다.

참고:

.pgc 파일의 기본 경로는 실행 파일 경로와 같습니다. 프로파일링 시나리오를 실행하기 전에 VCPROFILE_PATH 환경 변수를 설정하면 이 경로를 변경할 수 있습니다. 즉 VCPROFILE_PATH=<특정 경로>로 설정한 다음 계측 이미지 myapp.exe를 실행합니다.

이제 PGO 최적화된 myapp.exe를 빌드할 준비가 되었습니다.

/LTCG:PGO 및 /PGD를 사용하여 최적화된 이미지를 만들려면

  • link /ltcg:pgo /pgd:mypgd.pgd S1.obj … Sn.obj /out:myapp.exe
참고:

1단계를 수행하기 전에, 훈련 시나리오 동안 생성된 모든 .PGC 파일이 프로필 데이터베이스 파일(.PGD)과 동일한 폴더에 있는지 확인합니다.

사용자 지정 프로필 데이터 병합

응용 프로그램에 대해 두 개의 주 고객 시나리오가 있다고 가정합니다. 첫 번째 시나리오는 두 번째 시나리오보다 고객의 사용 빈도나 중요도가 두 배라고 가정합니다.

다음 단계를 통해 Visual Studio 개발 환경 및 명령줄 도구를 사용하여 .PGD 파일로 병합할 때 일부 프로필 데이터에 더 높은 가중치를 주는 방법을 배웁니다.

IDE에서 프로필 데이터 병합

Win32 프로젝트를 만들려면

  1. 파일 메뉴에서 새로 만들기를 선택한 다음 프로젝트를 선택합니다. 새 프로젝트 대화 상자가 나타납니다.

  2. 프로젝트 형식 창에서 Visual C++ 노드를 선택한 다음 템플릿 창에서 Win32 프로젝트를 선택합니다.

  3. 이름 상자에 PGODemo를 입력합니다.

  4. 확인 단추를 클릭합니다. Win32 응용 프로그램 마법사가 나타납니다.

  5. 모든 기본 설정을 그대로 두고 마침 단추를 클릭합니다.

IDE에서 병합된 프로필 데이터를 사용하여 PGODemo 프로젝트를 빌드하려면

  1. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 Release 구성을 선택합니다.

  2. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 계측을 클릭합니다.

  3. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 계측된/최적화된 응용 프로그램 실행을 클릭합니다. 그러면 응용 프로그램이 실행됩니다. 디버그 메뉴에서 시작이나 디버깅하지 않고 시작을 선택하는 일반적인 방법으로도 계측 응용 프로그램을 시작할 수 있습니다.

  4. 3단계를 각 고객 시나리오에 대해 한 번씩 반복합니다. 이 단계를 수행하면 출력 디렉터리에 PGODemo!1.pgc와 PGODemo!2.pgc의 두 .PGC 파일이 생성됩니다.

  5. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 속성을 클릭하면 PGODemo 속성 페이지 대화 상자가 표시됩니다.

  6. 구성 속성에서 빌드 이벤트를 클릭한 다음 링크 전 이벤트를 클릭합니다. 명령줄에 다음 명령을 입력합니다.

    "$(VCInstallDir)bin\pgomgr.exe" -merge:2 $(OutDir)\$(ProjectName)!1.pgc $(OutDir)\$(ProjectName).pgd

    참고:

    이 단계에서는 링커를 실행하여 최종 최적화 응용 프로그램을 빌드하기 전에 pgomgr.exe를 사용하여 PGODemo!1.pgc를 별도의 단계에서 병합합니다. 다음 단계 동안 링커에서는 pgomgr.exe를 다시 호출하여 PGODemo!2.pgc 파일을 병합하지만 이 경우 기본 가중치인 1이 사용됩니다.

  7. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 최적화를 클릭합니다.

명령줄에서 프로필 데이터 병합

명령줄 도구를 사용하여 사용자 지정 프로필 데이터를 다음과 같이 병합할 수 있습니다.

명령줄에서 병합된 프로필 데이터를 만들려면

  1. cl.exe /c /GL /O2 S1.cpp … Sn.cpp

  2. link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe

    이전 두 단계에서는 계측된 myapp.exe를 만듭니다.

  3. 계측된 myapp.exe를 두 개의 서로 다른 시나리오를 사용하여 훈련시키면 두 개의 서로 다른 .PGC 파일인 myapp!1.pgc와 myapp!2.pgc가 생성됩니다.

    pgomgr.exe를 사용하여 첫 번째 시나리오에 더 높은 가중치를 주려면 다음과 같이 입력합니다.

    Pgomgr –merge:2 myapp!1.pgc myapp.pgd

  4. 다음과 같이 링크 명령을 실행하여 최종 최적화 응용 프로그램을 만듭니다.

    link /ltcg:pgo /pgd:myapp.pgd /out:myapp.exe

    이렇게 하면 myapp!2.pgc가 기본 가중치인 1을 사용하여 병합됩니다.

PGO 업데이트

이전 두 시나리오에서는 계측 응용 프로그램을 빌드하고 훈련시킨 다음 /ltcg:pgo 링커 옵션을 사용하여 최종 최적화 응용 프로그램을 빌드했습니다. /ltcg:pgo 옵션을 사용하면 링커에서는 계측 응용 프로그램의 빌드에 사용된 입력 파일(개체 파일, 라이브러리 등)이 변경되지 않았는지 확인하기 위해 특정한 검사를 수행합니다. 즉 /ltcg:pgo를 사용하려면 링커에 전달된 모든 입력 파일이 /ltcg:pgi 단계에서 전달된 파일과 동일해야 합니다.

그 이유는 계측 응용 프로그램 및 .PGD 파일을 빌드한 후 실수로 소스 파일을 변경하면 PGO 코드 생성 및 최적화 판단에 엄청난 영향을 줄 수 있기 때문입니다.

계측 응용 프로그램을 빌드하고 프로필 데이터를 만들어 PGO 최적화 응용 프로그램을 빌드한 후, 응용 프로그램의 버전 번호를 업데이트하지 않았음을 발견하거나, 응용 프로그램의 흐름에 크게 영향을 주지 않으며 아주 간단한 수정을 필요로 하는 사소한 버그를 발견하게 될 수 있습니다. 이러한 시나리오에서 /ltcg:pgu 옵션을 사용할 수 있습니다. 이 옵션을 사용하면 /ltcg:pgo 옵션을 사용할 때 수행하는 검사를 링커에서 수행하지 않습니다. 파일을 편집하고 다시 컴파일할 수 있고, PGI와 PGU 빌드 사이에 응용 프로그램에 새 파일을 추가할 수도 있습니다.

다음 단계에서는 Visual Studio 개발 환경 및 명령줄에서 /ltcg:pgu 옵션을 사용하는 방법을 배웁니다.

IDE에서 업데이트

IDE에서 /LTCG:PGU를 사용하여 PGODemo를 빌드하려면

  1. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 Release 구성을 선택합니다.

  2. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 계측을 클릭합니다.

  3. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 계측된/최적화된 응용 프로그램 실행을 클릭합니다. 그러면 응용 프로그램이 실행됩니다. 디버그 메뉴에서 디버깅 시작이나 디버깅하지 않고 시작을 선택하는 일반적인 방법으로도 계측 응용 프로그램을 시작할 수 있습니다.

  4. 이 단계에서 변경 내용을 소스 파일에 적용할 수 있습니다. 위에서 언급한 대로 응용 프로그램의 동작에 큰 영향을 주는 변경 작업을 수행하면 성능이 크게 저하될 수 있습니다. 일반적으로 간단한 버그 수정이나 리소스 파일 변경 같은 사소한 변경 작업만 수행해야 합니다.

  5. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 업데이트를 클릭합니다. 이렇게 하면 변경된 파일만 다시 컴파일된 다음 /ltcg:pgo 대신 수정된 파일을 허용하는 /ltcg:pgu 옵션을 사용하여 링커가 실행됩니다.

    참고:

    프로필 데이터가 없는 새 함수 및 편집 결과로 훈련 단계에서 수집된 프로필 데이터가 무효화된 함수에 대해 각각 경고가 발생합니다. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 Release 구성을 선택합니다.

    참고:

    5단계에서 솔루션 탐색기에서 변경된 소스 파일을 마우스 오른쪽 단추로 클릭하고 컴파일을 클릭하면, PGO 빌드에서 정상 빌드로 전환하는 경우 프로젝트 시스템에서 정리 빌드를 수행하므로 출력 폴더에서 PGO 관련 파일이 모두 삭제됩니다.

명령줄에서 업데이트

명령줄 도구를 사용하여 다음과 같이 PGO 업데이트를 수행할 수 있습니다.

명령줄에서 /LTCG:PGU를 사용하여 빌드하려면

  1. cl.exe /c /GL /O2 S1.cpp … Sn.cpp

  2. link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe

    이전 두 단계에서는 계측된 myapp.exe를 만듭니다.

  3. 계측된 myapp.exe를 훈련시킵니다.

  4. link /ltcg:pgo /pgd:myapp.pgd /out:myapp.exe

    4단계에서는 최적화된 myapp.exe를 만듭니다. Sm.cpp에서 작은 버그를 발견했다고 가정하고, 버그를 수정한 후 다음과 같이 Sm.cpp만 컴파일합니다.

  5. cl /c /GL /O2 Sm.cpp

    그런 다음 /ltcg:pgu를 사용하여 3단계에서 만든 이전 프로필 데이터를 통해 최적화 응용 프로그램을 빌드합니다.

  6. link /ltcg:pgu /pgd:myapp.pgd /out:myapp.exe

사용자 지정 PGO 구성

이 시나리오에서는 여러 프로젝트가 포함된 솔루션을 빌드하기 위해 사용자 지정 PGO 구성을 만드는 방법을 배웁니다. 이 시나리오에서는 솔루션에 DLL을 추가한 다음 PGODemo 응용 프로그램에 링크합니다. 프로필 기반 최적화 메뉴 항목을 사용하여 각 제품을 하나씩 빌드하는 대신, PGIRelease와 PGORelease라는 두 가지 구성을 만들고 이들 구성을 사용하여 전체 솔루션을 한 번에 빌드합니다.

사용자 지정 PGO 구성을 만들려면

  1. 파일 메뉴에서 새로 만들기를 선택한 다음 프로젝트를 선택합니다. 새 프로젝트 대화 상자가 나타납니다.

  2. 프로젝트 형식 창에서 Visual C++ 노드를 선택한 다음 템플릿 창에서 Win32 프로젝트를 선택합니다.

  3. 이름 상자에 PGODemo를 입력합니다.

  4. 확인 단추를 클릭합니다. Win32 응용 프로그램 마법사가 나타납니다.

  5. 모든 기본 설정을 그대로 두고 마침 단추를 클릭합니다.

    PGODemo 솔루션 및 프로젝트가 만들어집니다. 다음으로는 DLL 프로젝트를 만듭니다.

  6. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 새 프로젝트를 클릭합니다. 새 프로젝트 대화 상자가 나타납니다.

  7. 프로젝트 형식 창에서 Visual C++ 노드를 선택한 다음 템플릿 창에서 Win32 프로젝트를 선택합니다.

  8. 이름 상자에 PGODemoDLL을 입력합니다.

  9. 확인 단추를 클릭합니다. Win32 응용 프로그램 마법사가 나타납니다.

  10. 응용 프로그램 설정 페이지에서 DLL 응용 프로그램 종류를 선택하고 마침을 클릭합니다.

    PGODemoDLL이라는 DLL 프로젝트가 만들어집니다.

  11. 솔루션 탐색기에서 PGODemoDLL 프로젝트를 두 번 클릭한 다음 PGODemoDLL.cpp를 두 번 클릭하고 다음 코드를 추가합니다.

    __declspec(dllexport) void HelloMessage(void)
    {
       MessageBox(NULL, L"hello", L"PGODemoDLL", MB_OK);
    }
    
  12. 솔루션 탐색기에서 PGODemo 프로젝트를 두 번 클릭하고 PGODemo.cpp를 두 번 클릭한 다음 _tWinMain 함수의 정의 앞에 다음 선언을 추가합니다.

    __declspec(dllimport) void HelloMessage(void);
    
  13. _tWinMain에서 주 메시지 루프 앞에 다음 코드를 추가합니다.

    HelloMessage();
    
  14. 솔루션 탐색기에서 PDODemo 솔루션을 마우스 오른쪽 단추로 클릭하고 프로젝트 종속성을 클릭합니다. 프로젝트 종속성 대화 상자가 열립니다.

  15. 종속성 페이지의 프로젝트 콤보 상자에서 PGODemo를 선택합니다. 다음에 종속 목록에서 PGODemoDLL을 선택합니다.

    다음으로는 PGIRelease 및 PGORelease 구성을 만듭니다.

  16. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 구성 관리자를 클릭합니다. PGODemo 프로젝트에 대한 구성 콤보 상자를 클릭하고 <새로 만들기 …>를 클릭합니다. 새 프로젝트 구성 대화 상자가 나타납니다.

    프로젝트 구성 이름 입력란에 PGIRelease를 입력하고 다음에서 설정 복사 콤보 상자에서 Release를 선택합니다. 새 솔루션 구성 만들기 확인란이 선택되어 있어야 합니다.

    PGODemoDLL 프로젝트에 대해 같은 단계를 반복하여 이 프로젝트에 PGIRelease 구성을 추가합니다. 이번에는 새 솔루션 구성 만들기 확인란이 선택되어 있지 않아야 합니다.

  17. 두 프로젝트 모두에 대해 16단계를 반복하여 PGORelease 구성을 만듭니다. 이번에도 Release 구성에서 설정을 복사해야 합니다. 구성 관리자 대화 상자를 닫습니다.

    이제 PGIRelease와 PGORelease라는 두 구성을 만들었습니다.

  18. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다. 구성 콤보 상자에서 PGIRelease 구성을 선택합니다. 구성 속성에서 일반을 클릭합니다. 전체 프로그램 최적화 콤보 상자를 클릭하고 프로필 기반 최적화 – 계측 옵션을 선택합니다. 적용을 클릭하여 변경 내용을 저장합니다.

  19. 구성 콤보 상자에서 PGORelease 구성을 선택합니다. 구성 속성에서 일반을 클릭합니다. 전체 프로그램 최적화 콤보 상자를 클릭하고 프로필 기반 최적화 – 계측을 선택합니다. 적용을 클릭하여 변경 내용을 저장합니다.

  20. PGODemoDLL 프로젝트에 대해 18 및 19단계를 반복하여 PGIRelease 및 PGORelease 구성을 적용합니다.

    이제 두 프로젝트 모두에서 PGORelease 구성에 대한 중간 디렉터리가 PGIRelease 구성에 대한 출력 디렉터리와 같아지도록 변경합니다.

  21. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다. 구성 콤보 상자에서 PGORelease 구성을 선택합니다. 구성 속성에서 일반을 클릭합니다. 중간 디렉터리에 $(SolutionDir)PGIRelease를 입력합니다. 적용을 클릭하고 대화 상자를 닫습니다.

  22. PGODemoDLL 프로젝트에 대해 21단계를 반복합니다.

    다음으로는 PGODemo 응용 프로그램의 경로 환경 변수에 PGODemoDLL.dll의 경로를 추가합니다.

  23. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다. 구성 콤보 상자에서 PGIRelease 구성을 선택합니다. 구성 속성에서 디버깅을 클릭합니다. 환경에 다음 내용을 입력하고 적용을 클릭합니다.

    path=%path%;$(SolutionDir)PGODemoDLL\PGIRelease

    구성 콤보 상자에서 PGORelease 구성을 선택합니다. 구성 속성에서 디버깅을 클릭합니다. 환경에 다음 내용을 입력합니다.

    path=%path%;$(SolutionDir)PGODemoDLL\PGORelease

    그런 다음 적용 및 확인을 차례로 클릭하여 대화 상자를 닫습니다.

  24. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다. 구성 콤보 상자에서 PGORelease 구성을 선택합니다. 구성 속성에서 링커를 클릭한 다음 최적화를 클릭합니다. 프로필 기반 데이터베이스 입력란에서 $(TargetDir)을 $(IntDir)\로 바꿉니다.

    PGODemoDLL 프로젝트에 대해 이 단계를 반복합니다.

  25. 솔루션 탐색기에서 PGODemoDLL 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다. 구성 콤보 상자에서 PGORelease 구성을 선택합니다. 구성 속성에서 링커를 클릭한 다음 고급을 클릭합니다. 가져오기 라이브러리 입력란에서 $(TargetDir)을 $(IntDir)\로 바꿉니다.

  26. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 PGIRelease 구성을 선택합니다. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 솔루션 빌드를 클릭합니다.

    이렇게 하면 두 프로젝트 모두에 대해 계측 응용 프로그램이 빌드됩니다.

  27. 디버그 메뉴를 클릭하고 디버깅 시작 또는 디버깅하지 않고 시작을 클릭합니다. 그러면 PGODemo가 시작됩니다. 응용 프로그램이 종료된 후 PGODemo\PGIRelease 및 PGODemoDLL\PGIRelease라는 두 출력 폴더에 각각 하나씩 두 개의 .PGC 파일이 생성됩니다.

  28. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 PGORelease 구성을 선택합니다. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 솔루션 빌드를 클릭합니다.

    이제 두 프로젝트 모두에 대해 PGORelease 구성 폴더에 PGO 최적화 이미지가 만들어집니다.

사용자 지정 프로필 데이터 수집

프로필 데이터 수집의 기본 동작은 계측 응용 프로그램이 시작될 때부터 종료될 때까지 동작을 설명하는 모든 데이터를 저장하는 것입니다. PGO에서는 프로필 데이터 수집을 쉽게 사용자 지정할 수 있는 PGOSWEEP이라는 도구를 제공합니다. PGOSWEEP을 사용하여 프로필 시나리오가 실행되는 동안 특정 시간대에 대한 프로필 데이터를 수집할 수 있습니다.

다음 단계에서는 Visual Studio 개발 환경 및 명령줄 도구를 사용하여 프로필 데이터 수집을 제어하는 방법을 배웁니다.

Win32 프로젝트를 만들려면

  1. 파일 메뉴에서 새로 만들기를 선택한 다음 프로젝트를 선택합니다. 새 프로젝트 대화 상자가 나타납니다.

  2. 프로젝트 형식 창에서 Visual C++ 프로젝트 노드를 선택한 다음 템플릿 창에서 Win32 프로젝트를 선택합니다.

  3. 이름 상자에 PGODemo를 입력합니다.

  4. 확인 단추를 클릭합니다. Win32 응용 프로그램 마법사가 나타납니다.

  5. 모든 기본 설정을 그대로 두고 마침 단추를 클릭합니다.

IDE에서 계측 PGODemo 프로젝트를 빌드하려면

  1. 표준 도구 모음에서 솔루션 구성 콤보 상자를 클릭하고 Release 구성을 선택합니다.

  2. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 계측을 클릭합니다.

  3. 솔루션 탐색기에서 PGODemo 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 바로 가기 메뉴에서 프로필 기반 최적화를 클릭한 다음 계측된/최적화된 응용 프로그램 실행을 클릭합니다. 그러면 응용 프로그램이 실행됩니다. 디버그 메뉴에서 디버깅 시작이나 디버깅하지 않고 시작을 선택하는 일반적인 방법으로도 계측 응용 프로그램을 시작할 수 있습니다.

  4. 도구 메뉴에서 외부 도구를 클릭합니다. 외부 도구 대화 상자가 표시됩니다. 추가를 클릭합니다. 제목 입력란에 Pgosweep을 입력합니다. 명령 콤보 상자 옆의 찾아보기 단추를 클릭하고 PGOSWEEP 도구에 대한 경로를 찾습니다. PGOSWEEP은 Visual Studio가 설치된 경로의 …\VC\bin 폴더에 설치되어 있어야 합니다. 인수 확인 확인란을 선택한 다음 확인을 클릭하여 외부 도구 대화 상자를 닫습니다.

  5. 도구 메뉴에서 Pgosweep을 클릭합니다. 대화 상자가 나타납니다. 인수 입력란에 다음 내용을 입력합니다.

    $(TargetPath) $(TargetDir)$(TargetName)_custom!1.pgc
    

    확인을 클릭합니다.

  6. PGODemo의 주 창에서 파일을 클릭하고 끝내기를 클릭하여 프로필 데이터 수집 실행을 종료합니다.

  7. 이제 $(OutDir) 안에서 두 개의 .PGC 파일을 찾을 수 있습니다. PGOSWEEP에서 생성한 파일인 PGODemo_custom!1.pgc에는 프로필 실행이 시작될 때부터 PGOSWEEP이 호출될 때까지의 프로필 데이터가 들어 있습니다. 두 번째 파일의 이름은 기본 명명 체계인 PGODemo!1.pgc이며 PGOSWEEP이 호출된 시점부터 계측 응용 프로그램이 종료될 때까지의 프로필 데이터가 들어 있습니다.

  8. 최적화 이미지를 빌드할 때 표준 명명 체계인 $(ProjectName)!n.PGC(n은 숫자)를 따르는 .PGC 파일만 자동으로 병합된다는 점에 주의해야 합니다. 이전 단계에서 만든 PGODemo_custom!1.pgc를 병합하려면 사용자 지정 병합 단계를 추가해야 합니다. 이 연습의 앞 부분에서 설명한 사용자 지정 프로필 데이터 병합 시나리오를 참조하십시오.

이들 단계를 사용하여 프로필 데이터 수집을 제어하고 응용 프로그램에서 런타임에 가장 중요한 부분을 기반으로 응용 프로그램을 최적화할 수 있습니다.

명령줄에서 프로필 데이터 수집

명령줄 도구를 사용하여 다음과 같이 사용자 지정 프로필 데이터 수집을 수행할 수 있습니다.

명령줄에서 병합된 프로필 데이터를 만들려면

  1. 다음과 같이 계측 실행 파일을 만듭니다.

    cl.exe /c /GL /O2 S1.cpp Sn.cpp 
    link /ltcg:pgi S1.obj Sn.obj /out:myapp.exe 
    
  2. 계측된 myapp.exe를 실행하고 실행 도중 필요한 시점에 pgosweep 도구를 사용하여 프로필 데이터를 수집합니다.

    Pgosweep myapp.exe mycustomdata.pgc
    

참고 표준 형식을 따르지 않는 PGC 파일은 Pgomgr 도구를 사용하여 수동으로 병합해야 합니다.

  1. myapp.exe가 종료된 후 또 하나의 .PGC 파일(myapp!1.pgc)이 자동으로 생성됩니다. 이 파일을 프로필 데이터의 일부로 사용하지 않으려면 최적화된 myapp.exe를 빌드하기 위해 링커를 실행하기 전에 이 파일을 삭제하거나 링커 작업 디렉터리 밖으로 이동해야 합니다.

  2. Pgomgr를 사용하여 mycustomdata.pgc 병합

    Pgomgr –merge mycustomdata.pgc myapp.pgd
    
  3. link 명령을 실행하여 최종 최적화 응용 프로그램을 만듭니다.

    link /ltcg:pgo /pgd:myapp
    

PgoAutoSweep을 통한 사용자 지정 프로필 데이터 수집

응용 프로그램에서 PgoAutoSweep을 호출하여 런타임에 언제라도 프로필 데이터를 저장하고 다시 설정할 수 있습니다. 다음 예제에서는 이러한 작업을 보여 줍니다.

다음 예제에서는 두 개의 .PGC 파일을 만듭니다. 첫 번째 파일에는 count가 3이 될 때까지 런타임 동작을 설명하는 데이터가 포함되고, 두 번째 파일에는 이 시점부터 응용 프로그램이 종료될 때까지 수집되는 데이터가 포함됩니다.

#include <stdio.h>
#include <windows.h>
#include <pgobootrun.h>

int count = 10;
int g = 0;

void func2(void)
{
    printf("hello from func2 %d\n", count);
    Sleep(2000);
}

void func1(void)
{
    printf("hello from func1 %d\n", count);
    Sleep(2000);
}
void main(void) 
{
    while (count--)
    {
        if(g)
            func2();
        else
            func1();
        if (count == 3) 
        {
            PgoAutoSweep("func1");
            g = 1;
        }
    }
    PgoAutoSweep("func2");
}

참고 항목

기타 리소스

Visual C++ 2008의 연습 항목