Program Languege/WinAPI

QueryPerformance

Frozen0113 2014. 4. 10. 10:19

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

         http://sweeper.egloos.com/viewer/2820035