기술 노트

Windows 고성능 타이머 사용법: QueryPerformanceFrequency와 QueryPerformanceCounter

anothel 2025. 1. 6. 18:13

1. 개요

Windows 환경에서 정밀한 시간 측정을 위해 고성능 타이머 함수인 QueryPerformanceFrequency와 QueryPerformanceCounter를 사용한다. 이 함수들은 나노초 수준의 시간 측정이 가능하며, 프로그램 성능을 분석하거나 정확한 시간 간격을 측정하는 데 유용하다.

2. 예시 코드

다음은 두 함수의 기본적인 사용 예제를 보여준다.

#include <windows.h>
#include <iostream>

int main() {
    LARGE_INTEGER tStart, tEnd, frequency;

    // 주파수 얻기
    QueryPerformanceFrequency(&frequency);

    // 시작 시점 기록
    QueryPerformanceCounter(&tStart);

    // 측정할 코드 블록
    Sleep(1000); // 1초 대기

    // 종료 시점 기록
    QueryPerformanceCounter(&tEnd);

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

    std::cout << "경과 시간: " << elapsedTime << " 초" << std::endl;

    return 0;
}

2.1 QueryPerformanceFrequency 함수

설명

QueryPerformanceFrequency는 고해상도 타이머의 주파수를 반환한다. 이 값은 타이머의 해상도를 나타내며, 시스템 부팅 후 고정된 값을 유지한다.

파라미터

  • &freq: 주파수 값을 저장할 변수를 가리키는 포인터

작동 방식

  • 초당 타이머가 몇 번 틱을 기록하는지 나타낸다. 예를 들어, 주파수가 1,000,000이라면 타이머는 초당 1,000,000번 증가한다.

사용 예시

  • 주파수 값은 나중에 경과 시간을 계산할 때 사용된다. 예를 들어, 100,000 틱이 지났고 주파수가 1,000,000이라면 경과 시간은 0.1초이다.

2.2 QueryPerformanceCounter 함수

설명

QueryPerformanceCounter는 현재 고해상도 타이머의 값을 반환한다. 이 값은 경과된 "틱 수"를 의미하며, 시작 시점과 종료 시점의 차이를 통해 경과 시간을 계산할 수 있다.

파라미터

  • &count: 현재 카운터 값을 저장할 변수를 가리키는 포인터

작동 방식

  • 프로그램이 실행된 이후 고해상도 타이머가 기록한 틱 수를 반환한다. 이 값은 시간이 지남에 따라 계속 증가한다.

사용 예시

  • 시작 시점과 종료 시점의 카운터 값을 비교하여 경과 시간을 계산한다.

2.3 시간 차이 계산

카운터 값과 주파수를 조합하여 경과 시간을 계산할 수 있다.

  1. start와 end 값을 얻는다.
  2. 두 값의 차이를 구한다: end.QuadPart - start.QuadPart
  3. 이 차이를 주파수로 나눈다: (end.QuadPart - start.QuadPart) / frequency.QuadPart

이를 통해 초 단위로 정확한 경과 시간을 얻을 수 있다.

3. 정리

Windows의 고성능 타이머 함수는 정밀한 시간 측정이 필요한 애플리케이션에 매우 유용하다.

  • QueryPerformanceFrequency는 타이머의 주파수를 반환하여 해상도를 제공한다.
  • QueryPerformanceCounter는 특정 시점의 카운터 값을 반환하여 경과 시간을 계산할 수 있게 한다.

두 함수의 조합을 통해 나노초 수준의 정밀한 시간 측정을 구현할 수 있으며, 성능 분석 및 시간 간격 측정과 같은 다양한 시나리오에 활용할 수 있다.

https://learn.microsoft.com/ko-kr/windows/win32/sysinfo/acquiring-high-resolution-time-stamps

 

고해상도 타임스탬프 획득 - Win32 apps

Windows는 고해상도 타임스탬프를 획득하거나 시간 간격을 측정하는 데 사용할 수 있는 API를 제공합니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/windows/win32/api/profileapi/

 

Profileapi.h 헤더 - Win32 apps

피드백 이 문서의 내용 --> 이 헤더는 System Services에서 사용됩니다. 자세한 내용은 다음을 참조하세요. profileapi.h에는 다음과 같은 프로그래밍 인터페이스가 포함되어 있습니다. Functions   QueryPerfo

learn.microsoft.com

 

728x90