QueryPerformance을 이용해 프로그램 실행 속도 측정
컴퓨터 메인보드의 고해상도 타이머를 이용해 시간 간격을 측정한다.
현재 실행 속도를 측정하고 싶으면 QueryPerformanceCounter(=QPC)를 이용하면 된다.
하지만 QPC는 외부 시간 참조와 독립적이며 동기화되지 않으므로 현재 시간값을 구하고 싶으면 GetSystemTimePreciseAsFildTime을 이용하라고 MSDN에 나와있다.
QueryPerformanceFrequency와 QueryPerformanceCounter를 이용하면 타이머, FPS 측정 등 여러 방면으로 활용할 수 있다.
◎ QueryPerformanceFrequency
성능 카운터의 빈도를 검색한다.
BOOL QueryPerformanceFrequency(
LARGE_INTEGER *lpFrequency
);
lpFrequency = 현재 성능 카운터, 타이머의 주파수를 반환한다.
◎ QueryPerformanceCounter
시간 간격 측정에 사용할 수 있는 고해상도 타임 스탬프인 성능 카운터의 현재 값을 검색한다. 그러니까 현재 CPU의 틱을 받아오는 것이다.
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount
);
lpPerformanceCount = 매개변수로 현재 성능 카운터 값을 계수로 받는 변수에 대한 포인터를 넘겨준다.
반환 값은 함수가 성공하면 0 이외의 값을 리턴하고 실패하면 0을 리턴한다.
(Windows XP 이상에서는 이 기능이 항상 성공해서 0을 리턴하는 경우는 없다.)
◎ LARGE_INTEGER
여기서 쓰이는 LARGE_INTEGER는 뭘까?
QueryPerformanceCounter나 QueryPerformanceFrequency같은 함수를 사용하기 위해선 크기가 큰 정수형이 필요하다.
왜? 더 자세한 시간값을 저장하기 위해서
그래서 windows.h에 포함돼 있는 LARGE_INTEGER가 그와 같은 것이다.
부호가 있는 64비트 정수형 데이터를 저장하기 위해 선언된 사용자 정의 자료형.
LARGE_INTEGER는 구조체인데 그 안을 들여다 보면
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart; // 32bit 정수형
LONG HighPart; // 32비트 정수형
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart; // 64비트 정수형
} LARGE_INTEGER;
이렇게 되어 있다.
컴파일러가 64비트를 지원할 땐 64비트 정수형 변수에, 32비트 지원 시에는 32비트 정수형 변수에 64비트 측정값을 나눠 저장한다.
값은 64비트의 부호있는 정수형인 QuardPart에 저장되는 것이며
LowPart는 하위 32비트 DWORD형, HighPart는 상위 32비트 LONG 형이다.
64비트 중 LowPart(32bit)와 HighPart(32bit)를 둘다 사용함으로써 더 큰값을 사용할 수 있다.
◎ 사용법
#include <windows.h>
int main()
{
LARGE_INTEGER timer, start, end;
float DeltaTime;
QueryPerformanceFrequency(&timer); // 타이머의 주파수를 얻어온다.
QueryPerformanceCounter(&start); // 시작 시점의 CPU 클럭 수
// 실행할 내용
QueryPerformanceCounter(&end); // 종료 시점의 CU 클럭 수
DeltaTime = (end.QuadPart - start.QuadPart) / (float)timer.QuadPart; // 걸린 시간 계산
}
참고 자료;
https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter
'Study > C++ , C#' 카테고리의 다른 글
[C++] 전처리기 지시문 (0) | 2020.01.19 |
---|---|
[C++] 클래스(Class)와 구조체(Struct)의 차이 (0) | 2020.01.15 |
[C++] 매크로 함수와 인라인 함수(Inline) (0) | 2020.01.10 |
[C++] new 와 delete (0) | 2020.01.10 |
[C++] 참조자와 함수 (0) | 2020.01.08 |