윈도우 운영체제에서 시스템의 경과 시간을 측정하는 데 사용되는 함수로 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
'프로그래밍 > C' 카테고리의 다른 글
윈도우 소켓 ] 소켓과 연결된 원격 호스트의 IP주소와 Port번호 가져오기, getpeername() (0) | 2023.10.28 |
---|---|
Win32 API ] waitForSingleObject, waitForMultipleObjects (0) | 2023.10.14 |
윈도우 소켓 ] 논블로킹 소켓, ioctlsocket, 소켓 함수의 리턴 조건과 WSAEWOULDBLOCK이 리턴되는 상황 (0) | 2023.10.02 |
윈도우 소켓 ] 소켓 옵션, setsockopt, getsockopt, SOL_SOCKET 옵션들 (0) | 2023.10.01 |
윈도우 소켓 ] connect 비동기로 처리하기 (0) | 2023.09.30 |