본문 바로가기
프로그래밍/C

고해상도 타이머 QueryPerformanceFrequency, QueryPerformanceCounter

by eteo 2023. 10. 9.

 

 

윈도우 운영체제에서 시스템의 경과 시간을 측정하는 데 사용되는 함수로 GetTickCount()와 GetTickCount64()가 있다. 이 함수는 시스템 부팅 이후 경과한 밀리초(ms)단위의 시간을 반환하며 주로 시간 간격을 측정하는 데 사용된다. 

 

GetTickCount() 함수는 32비트 부호없는 정수 타입으로 시간을 반환하며, 시스템이 부팅된 이후 49.7일이 지나면 오버플로우가 발생되므로 64비트 부호없는 정수로 시간을 반환하는 GetTickCount64()를 대신 사용하는 것이 권장된다.

 

다만 이 함수의 해상도는 일반적으로 10밀리초에서 16밀리초 범위의 시스템 타이머의 해상도로 제한되기 때문에, 조금더 고해상도 타이머가 필요하다면 QueryPerformanceFrequency(), QueryPerformanceCounter() 함수를 사용할 수 있다.

 

 

 

QueryPerformanceFrequency() : 시스템 부팅 시 고정되는 고성능 타이머의 주파수를 반환한다.

 

QueryPerformanceCounter() : 고성능 타이머(<1us)의 현재 카운터 값을 반환한다.

 

 

 

코드 1.

 

#include <stdio.h>
#include <Windows.h>

int main(void)
{
	DWORD memTick = 0;

	while (1)
	{
		DWORD diff = GetTickCount64() - memTick;
		if (diff >= 100)
		{
			memTick = GetTickCount64();
			printf("diff = %d\r\n", diff);
		}
	}

	return 0;
}

 

 

GetTickCount64() 함수를 상대적으로 긴 시간 범위를 측정하는 데는 문제가 없을 것이지만 100ms 시간간격을 측정할 때 오차가 발생한다.

 

 

 

 

 

코드 2.

 

 

#include <stdio.h>
#include <Windows.h>

int main(void)
{
	LARGE_INTEGER frequency, start_time, end_time;

	QueryPerformanceFrequency(&frequency);
	QueryPerformanceCounter(&start_time);

	while (1)
	{
		QueryPerformanceCounter(&end_time);

		double elapsedTime = static_cast<double>(end_time.QuadPart - start_time.QuadPart) / frequency.QuadPart;

		if (elapsedTime >= 0.1) {
			printf("diff = %lfs\r\n", elapsedTime);
			start_time = end_time;
		}
	}

	return 0;
}

 

 

 

 

0.1초 간격을 감지할 수 있다.

GetTickCount64() 함수의 해상도가 10ms~16ms 정도이니 그 이하의 시간이 걸리는 코드의 수행 시간을 측정하는데에도 고해상도 타이머 함수를 사용할 수 있다.

 

 

 

참고로 LARGE_INTEGER는 공용체로 다음과 같이 생겼다.

 

typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
} LARGE_INTEGER;

 

 

 

 

 

 

Reference :

https://learn.microsoft.com/ko-kr/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount

 

GetTickCount 함수(sysinfoapi.h) - Win32 apps

시스템이 시작된 후 경과된 시간(최대 49.7일)을 검색합니다.

learn.microsoft.com