윈도우 운영체제에서 시스템의 경과 시간을 측정하는 데 사용되는 함수로 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
'프로그래밍 > C' 카테고리의 다른 글
| Win32 API ] 이벤트 / CreateEvent, SetEvent, ResetEvent (0) | 2023.10.31 |
|---|---|
| Win32 API ] waitForSingleObject, waitForMultipleObjects (0) | 2023.10.14 |
| C] strstr, strcmp, strncmp, stricmp, strnicmp 함수 구현 (0) | 2023.09.15 |
| C ] Data Types Range (0) | 2023.09.15 |
| extern "C" {} (0) | 2023.07.18 |