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 시간 차이 계산
카운터 값과 주파수를 조합하여 경과 시간을 계산할 수 있다.
- start와 end 값을 얻는다.
- 두 값의 차이를 구한다: end.QuadPart - start.QuadPart
- 이 차이를 주파수로 나눈다: (end.QuadPart - start.QuadPart) / frequency.QuadPart
이를 통해 초 단위로 정확한 경과 시간을 얻을 수 있다.
3. 정리
Windows의 고성능 타이머 함수는 정밀한 시간 측정이 필요한 애플리케이션에 매우 유용하다.
- QueryPerformanceFrequency는 타이머의 주파수를 반환하여 해상도를 제공한다.
- QueryPerformanceCounter는 특정 시점의 카운터 값을 반환하여 경과 시간을 계산할 수 있게 한다.
두 함수의 조합을 통해 나노초 수준의 정밀한 시간 측정을 구현할 수 있으며, 성능 분석 및 시간 간격 측정과 같은 다양한 시나리오에 활용할 수 있다.
https://learn.microsoft.com/ko-kr/windows/win32/sysinfo/acquiring-high-resolution-time-stamps
https://learn.microsoft.com/ko-kr/windows/win32/api/profileapi/
'기술 노트' 카테고리의 다른 글
문자열 인코딩의 이해: ASCII, UTF-8, CP949, EUC-KR (0) | 2025.01.08 |
---|---|
메모리 할당 전략 비교: 1MB * 100 vs 100MB * 1 (0) | 2025.01.07 |
이진탐색(Binary Search) 완벽 가이드 (1) | 2025.01.05 |
Shunting Yard 알고리즘: 중위 표기법에서 후위 표기법으로 (1) | 2025.01.04 |
Python과 C 언어의 효율적인 결합: ctypes와 C 확장 모듈 (0) | 2024.12.22 |