QueryPerformance
QueryPerformance
WinAPI에서 제공하는 시간 체크에 대한 함수 중 가장 정밀도가 높은 함수는 QueryPerformanceCount입니다. 이 함수는 모든 컴퓨터(메인보드인지 CPU인지는 조금 더 찾아봐야할 것 같다.)에서 지원하는 함수는 아니기 때문에 QueryPerformanceFrequency함수를 통하여 컴퓨터에서 지원을 하는지 여부와 지원하는 정밀도에 대한 값을 확인해야합니다.
주의 점!
- QueryPerformanceCount의 경우 CPU의 사양에 따라 정밀도가 달라지며 시간 체크에 대한 값도 달라집니다.
- 멀티 프로세서에서 사용시 한 프로세서에서만 측정하는 것이 좋다고합니다. BIOS나 HAL 레이어의 버그로 인해 프로세서간에 서로 값을 다르게 넘기는 경우가 있다고 합니다.
- CPU 클럭수의 변경으로 인한 문제가 발생한다고 합니다.(rdtsc에서도 같은 문제가 발생했으며 Window7부터는 이런 문제가 없어졌다고 합니다.)
- CPU가 지원하지 않는 경우에 대해서도 처리해주어야합니다.
- 정밀도가 높은 대신 연산량도 많습니다.(GetTickCount, timeFetTime에 비해)
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
#endif //MIDL_PASS
LONGLONG QuadPart;
} LARGE_INTEGER;
typedef __int64 LONGLONG;
BOOL QueryPerformanceFrequency(LARGEINTEGER *lpFrequency)
- lpFrequency
CPU에서 지원하는 정밀도를 받아옵니다. 초당 몇번의 카운팅을 하는지를 알려준다.
- 반환 값
하드웨어에서 지원한다면 TRUE, 아니면 FALSE를 반환합니다.
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)
- 반환 값
함수가 성공했다면 TRUE, 아니면 FALSE를 반환합니다.
- lpPerformanceCount
현재 카운터를 받아옵니다.
출처 - http://blog.naver.com/linoer_mabi?Redirect=Log&logNo=80210893768