매우 정확한 시간차를 구해야 할 때 사용할 수 있는 함수입니다.
사용의 편의에 초점을 맞춰 함수를 구성했습니다.
방법은 널리 알려진 QueryPerformanceCounter를 이용한 것입니다..
//---------------------------------------------------------------------------
// 고정밀도의 정확한 시간차 구하기.
//
// 현재시간과 time 간의 시간차에 해당하는 카운터 값을 돌린다.
// time == 0이면 현재시간에 해당하는 카운트 값을 넣고 Freq를 세팅하고 시간차를 0을 돌린다.
// 그러므로 처음에는 time = 0 && freq != NULL로 호출하고,
// 그 다음에 호출하면 그 간의 시간차에 해당하는 카운터를 돌린다.
// 즉 리턴되는 시간차를 주파수인 (double)freq로 나누면 실제 시간차가 나온다.
LONGLONG GetTimeBetweenNS(LARGE_INTEGER& time, LARGE_INTEGER* freq = NULL)
{
LARGE_INTEGER StartTick, CurrentTick;
if (time.QuadPart == 0)
{
QueryPerformanceCounter(&StartTick);
if (freq != NULL)
QueryPerformanceFrequency(freq);
time = StartTick;
return 0;
}
QueryPerformanceCounter(&CurrentTick);
LONGLONG between = CurrentTick.QuadPart - time.QuadPart;
time = CurrentTick;
return between;
};
//---------------------------------------------------------------------------
// Test 예.
LARGE_INTEGER NSTime, NSFreq;
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
LONGLONG between = GetTimeBetweenNS(NSTime, &NSFreq);
Label2->Caption = between;
Caption = NSFreq.QuadPart;
double between2 = (double)between / NSFreq.QuadPart;
Label3->Caption = FormatFloat("0.0000000000 초", between2);
}
//---------------------------------------------------------------------------
잘 하면 타이머로도 활용 가능하겠죠.
|
다음과 같은 방법도 많이 쓰입니다.
#include <mmsystem.h>
// CPU 자원 최대 사용하도록 준비.
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
// 시간 측정 준비
timeBeginPeriod(1);
DWORD starttime = timeGetTime();
//
// 어떤 작업
//
DWORD endtime = timeGetTime();
// 시간 측정. ms 단위.
DWORD timebetween = endtime - starttime;
// 종료
timeEndPeriod(1);