Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/4 »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Profile - 분석표라고 정의하는게 맞는것 같다.

Visual C++ Profiling

Visual C++에서는 함수별 실행 시간, 수행 횟수 비율 등 다양한 기능을 보여주는 프로파일링 기능을 제공한다. 참고로 자바에서는 JProfiler, UNIX/Linux에서는 gprof라는 프로그램이 있다.

사용방법

1. Project Setting(Alt+F7) 에서 Ling탭의 Enable profiling을 체크한다.

3. Rebuild(재빌드)한다.

4. Build -> Profile을 선택한다.

5. Profile에서 원하는 값을 선택후 OK를 누른다.

6. 프로그램을 실행후 종료하면
Output창에 Profile이 선택되어 결과가 출력된다.


※ Window2000에서 profile 메뉴가 활성화되지 않는 문제점

Visual Studio가 설치될 때 Profile과 관련된 레지스트리 정보를 HKEY_CURRENT_USER 아래에 써넣는다. 그래서 Visual Studio를 설치할 때 사용했던 계정으로 로그인하지 않으면 profile이 활성화되지 않는다.

이를 해결하려면 VC를 설치할 때 접속했던 계정으로 로그인을 하던가, 아니면 레지스트리에 값을 써넣어주면 된다. 메모장으로 아래의 내용을 복사한후 *.reg파일로 저장한다.(파일이름은 상관없음)

    REGEDIT4
    [HKEY_LOCAL_MACHINE\Software\Microsoft\DevStudio\6.0\General]
    "ProfilerInstalled"=dword:1

이 파일을 더블클릭하면 레지스트리에 값이 써지고 VC에 profile 메뉴가 활성화된다.

이 정보는 MSDN에서 Q224382로 찾아보시면 되겠다.


수행시간 측정

1. clock()
ANSI C 함수이며 time.h에 정의되어 있어 UNIX/Linux에서도 잘 수행된다.
현 프로세스가 실행한지 얼마 되었는지에 대한 CPU 시간을 clock tick의 개수 단위로 반환해준다.

#include "time.h"

// 시작
clock_t beginTime;
clock_t endTime;
beginTime = clock();

// 작업 수행

// 수행 종료
endTime = clock();

// 값 출력
CString tmp = _T("");
tmp.Format("작업 수행 시간 - clock() : %5.3f",
           (double)(endTime - beginTime) / CLOCKS_PER_SEC); 

2. timeGetTime(), GetTickCount()
1/1000초 단위로 정확하게 제어할 수 있는 타이머가 바로 멀티미디어 타이머이다. 자세하게 말한다면 Timer Event Callback Notification 메커니즘을 적용하고 있는 타이머이다. 이 멀티미디어 타이머의 단점은 많이 사용할수록 시스템에 상당한 부하를 일으키며, 이외에 제대로 사용하지 못하면 예측할 수 없는 결과가 초래된다고 알려져있다. 이 타이머는 수행 시간 기준으로 일정한 시간이 되면 어떠한 행동을 취하는데 사용된다.
GetTickCount() 함수와 timeGetTime() 함수의 차이점은 운영체제의 정밀도에 차이가 있다. 예를 들어 GetTickCount()함수는 윈도우 9X에서는 기본으로는 약 55 밀리 초이지만, timeGetTime() 함수는 윈도우 9X에서는 1밀리 초이다. 따라서 부정확해질 수 있다. 그러므로 결국 timeGetTime()을 사용하는 게 유리하다. 다만 두 함수는 윈도우 2000, XP등 으로 올라갈수록 정밀도가 현격하게 벌어지게 된다. 따라서 최소의 타이머 해상도를 결정하는 timeBeginPeriod()함수와 timeBegindPeriod에 의해 만들어진 타이머 해상도를 제거하는 timeEndPeriod() 함수를 추가해 줌으로써 정밀도를 보정해 줄 수 있다. 정확한 시간을 구하지 않는 다는 가정 하에서는 두 함수 중에서 편한대로 선택한다.

#include "Mmsystem.h"
#pragma comment(lib,"winmm.lib")

// 시작
timeBeginPeriod(1);
DWORD tStart,tEnd;
tStart = timeGetTime();
// tStart = GetTickCount();

// 작업수행

// 수행 종료
tEnd = timeGetTime();
// tEnd = GetTickCount();
timeEndPeriod(1);

// 값 출력
CString tmp = _T("");
tmp.Format("작업 수행 시간 - timeGetTime() : %5.3f", (tEnd-tStart)/1000.0); 
 
3. QueryPerformanceCount()
초당 증가값을 주파수(frequency)라고 한다면, 그 값을 구하며 부팅 후 절대로 변하지 않는 방식을 적용한 QueryPerformanceCount() 함수는 7~8백만분의 1초까지 더 정밀하게 구하기 위해 사용한다.
 
// 시작
LARGE_INTEGER frequency, tStart, tEnd;
QueryPerformanceFrequency( &frequency );
QueryPerformanceCounter( &tStart );

// 작업 수행

// 수행 종료
QueryPerformanceCounter( &tEnd );
double tElpased =  \
(double)(tEnd.QuadPart - tStart.QuadPart)/(double)frequency.QuadPart;

// 값 출력
CString tmp = _T("");
    tmp.Format("작업 수행 시간 -  QueryPerformanceCounter() : %5.3f", tElpased); 

CRunTimeChk


위에서 소개한 clock,
QueryPerformanceCount
를 각각 사용해서 수행시간을 체크하는 클래스이다.


참고
CxImage를 이용한 Visual C++ 디지털 영상처리(정성호,이문호) - p.106
: