본문 바로가기
개발/mfc

win32 경과 시간을 계산, GetTickCount, GetSystemTimeAsFileTime 등

by 즐기며 2025. 9. 9.

Win32 환경에서 경과 시간을 계산하는 방법은 여러 가지가 있지만, 가장 일반적인 방법을 몇 가지 소개하겠습니다. C/C++를 기준으로 설명하며, 고해상도 타이머와 기본적인 방법을 포함합니다.

1. GetTickCount()를 사용한 방법

GetTickCount는 시스템이 부팅된 이후의 밀리초 단위 시간을 반환합니다. 간단하지만 정밀도가 낮습니다 (약 10~16ms 단위).

#include <windows.h>
#include <stdio.h>

int main() {
    DWORD startTime = GetTickCount();
    
    // 시간 측정이 필요한 작업 수행
    Sleep(1000); // 예: 1초 대기

    DWORD endTime = GetTickCount();
    DWORD elapsedTime = endTime - startTime;

    printf("경과 시간: %u 밀리초\n", elapsedTime);
    return 0;
}
  • 장점: 간단하고 사용하기 쉬움.
  • 단점: 정밀도가 낮아 짧은 시간 측정에는 부정확할 수 있음.

 

 

2. QueryPerformanceCounter를 사용한 고해상도 타이머

QueryPerformanceCounter는 높은 정밀도로 시간을 측정할 수 있는 고해상도 타이머입니다. 마이크로초 단위로 측정 가능합니다.

 
#include <windows.h>
#include <stdio.h>

int main() {
    LARGE_INTEGER frequency, start, end;
    double elapsedTime;

    // 타이머의 주파수(1초당 틱 수) 가져오기
    QueryPerformanceFrequency(&frequency);
    
    // 시작 시간
    QueryPerformanceCounter(&start);

    // 시간 측정이 필요한 작업 수행
    Sleep(1000); // 예: 1초 대기

    // 종료 시간
    QueryPerformanceCounter(&end);

    // 경과 시간 계산 (초 단위)
    elapsedTime = (double)(end.QuadPart - start.QuadPart) / frequency.QuadPart;

    printf("경과 시간: %.6f 초\n", elapsedTime);
    return 0;
}
  • 장점: 마이크로초 수준의 고해상도 시간 측정 가능.
  • 단점: 약간 더 복잡하며, 하드웨어 의존적일 수 있음.

 

 

 

3. GetSystemTimeAsFileTime을 사용한 방법

GetSystemTimeAsFileTime은 100나노초 단위로 시간을 제공하며, UTC 시간을 기반으로 합니다.

 
#include <windows.h>
#include <stdio.h>


ULONGLONG elapsed_ns( FILETIME start, FILETIME  end){
	ULARGE_INTEGER startTime, endTime;

	// FILETIME을 64비트 정수로 변환
    startTime.LowPart = start.dwLowDateTime;
    startTime.HighPart = start.dwHighDateTime;
    endTime.LowPart = end.dwLowDateTime;
    endTime.HighPart = end.dwHighDateTime;

	// 경과 시간 계산 (100나노초 단위)
    return endTime.QuadPart - startTime.QuadPart;
}

int main() {
    FILETIME start, end;

    // 시작 시간
    GetSystemTimeAsFileTime(&start);

    // 시간 측정이 필요한 작업 수행
    Sleep(1000); // 예: 1초 대기

    // 종료 시간
    GetSystemTimeAsFileTime(&end);

    // 경과 시간 계산 (100나노초 단위)
    ULONGLONG elapsed = elapsed_ns ( start, end );

	// 밀리초로 변환
    double elapsedMs = elapsed / 10000.0;

    printf("경과 시간: %.3f 밀리초\n", elapsedMs);
    return 0;
}
  • 장점: 고해상도이고 시스템 시간 기반.
  • 단점: FILETIME 구조체를 다루는 게 약간 복잡.

 

 

4. 선택 가이드

  • 짧은 시간 측정: QueryPerformanceCounter를 추천 (정밀도가 높음).
  • 간단한 작업: GetTickCount로 충분.
  • 시스템 시간 기준: GetSystemTimeAsFileTime 사용.