[MFC] Performance Counter를 사용하여 코드 속도 측정하기
Visual Studio 2012 사용
Performance Counter를 사용해 함수나 코드의 속도를 좀 더 정확히 측정해보자.
GetTickCount()보다 정확하다.
Performance Counter란?
- OS나 어플리케이션, 서비스, 드라이버가 잘 실행되고 있는지를 나타내는 정보에 사용하는 카운터를 의미함
이 카운터로 Performance Counter Frequency라는 주파수에 따라 1초당 진행되는 틱 수 계산하여 속도를 측정하는 방식을 말한다.
우리가 사용할 함수는 QueryPerformanceFrequency()와 QueryPerformanceCounter()이다.
1. 함수 설명
1) QueryPerformanceFrequency 함수 원형
BOOL WINAPI QueryPerformanceFrequency( _Out_ LARGE_INTEGER *lpFrequency );
파라미터:
lpFrequency: 현재 performance counter 주파수의 포인터를 반환한다.
2) QueryPerformanceCounter 함수 원형
BOOL WINAPI QueryPerformanceCounter( _Out_ LARGE_INTEGER *lpPerformanceCount );
파라미터:
lpPerformanceCount: 현재 performance counter의 값을 포인터로 반환한다.
2. 활용
main.cpp
{ LARGE_INTEGER Frequency; LARGE_INTEGER BeginTime; LARGE_INTEGER Endtime; __int64 elapsed; double duringtime; //프로그램이나 클래스 시작부분에 QueryPerformanceFrequency( &Frequency ); //사용하고자 하는 부분에 다음 코딩 QueryPerformanceCounter( &BeginTime ); ////////////////////////////// //프로그램 코드 ////////////////////////////// QueryPerformanceCounter( &Endtime ); elapsed = Endtime.QuadPart- BeginTime.QuadPart; duringtime = (double)elapsed / (double)Frequency.QuadPart; duringtime *=1000; //ms로 변환 }
QueryPerformanceFrequency( &Frequency ) 구문은 CPU 주파수에 따른 1초당 진행되는 틱수를 나타낸다. 변동이 없어서 한번만 읽어주면 된다.
검사할 프로그램 시작 전에 BeginTime으로, 프로그램 코드 이후에 EndTime으로 PerformanceCounter를 입력 받는다.
두 개의 차이를 주파수 값으로 나눠주면 속도 측정 가능하다.
duringtime 이 마이크로 초 이기에 1000을 곱해 ms로 변환한다.
끝