본문 바로가기
프로그래밍

QueryPerformanceCounter 분석

by ictlab 2009. 9. 22.

QueryPerformanceCounter 사용을 위해 분석한 내용을 정리해 보았다.

관련 변수 크기  : 예상대로 모두 8바이트였다

sizeof(LARGE_INTEGER):8
sizeof(INT64):8
sizeof(LONGLONG):8
sizeof(__int64):8


카운터 데이터 분석
QueryPerformanceCounter=2832505842
QueryPerformanceFrequency=3579545
컴퓨터를 켠지 0.219806 시간이 지났습니다

2^63=9223372036854775808.000000
2^63 i=-9223372036854775808
2^64 i=-9223372036854775808

__int64변수의 최대값(2^63-1)=9223372036854775807
i/f=2576688388288 secs
715746774 hours
29822782 days
81706 years


결론적으로 QueryPerformanceCounter 를 이용한 시간 계산은

컴퓨터를 켠후 81,706년 동안 끄지 않아도 시간 계산하는데 문제가 없다

물론 데이터 변수의 크기로만 봤을때의 가정이다.

변수와 상관없이 CPU의 타이머가 실제로 변수 크기 만큼 지원하지 않을 가능성도 있을 것이다.







#include <math.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Memo1->Lines->Add("sizeof(LARGE_INTEGER):"+ IntToStr(sizeof( LARGE_INTEGER)));
   Memo1->Lines->Add("sizeof(INT64):"+IntToStr(sizeof( INT64 )));
   Memo1->Lines->Add("sizeof(LONGLONG):"+IntToStr(sizeof( LONGLONG)));
   Memo1->Lines->Add("sizeof(__int64):"+IntToStr(sizeof( __int64 )));

   LARGE_INTEGER count, freq;
   QueryPerformanceCounter(&count);
   QueryPerformanceFrequency(&freq);

   String sBuf;
   sBuf.printf("QueryPerformanceCounter=%Li", count) ;
   Memo1->Lines->Add(sBuf);
   sBuf.printf("QueryPerformanceFrequency=%Li", freq);
   Memo1->Lines->Add(sBuf);


   sBuf.printf("컴퓨터를 켠지 %lf 시간이 지났습니다", count.QuadPart/(double)freq.QuadPart/60.0 / 60.0);
   Memo1->Lines->Add(sBuf);



   Memo1->Lines->Add("");

   __int64 i;
   sBuf.printf("2^63=%Lf", powl(2, 63));
   Memo1->Lines->Add(sBuf);

   i = (__int64) powl(2, 63);
   sBuf.printf("2^63 i=%Ld", i);
   Memo1->Lines->Add(sBuf);

   i = (__int64) powl(2, 64);
   sBuf.printf("2^64 i=%Ld", i);
   Memo1->Lines->Add(sBuf);


   Memo1->Lines->Add("");

   i = (__int64) powl(2, 63)-1;
   sBuf.printf("__int64변수의 최대값(2^63-1)=%Ld", i);
   Memo1->Lines->Add(sBuf);


   __int64 f = freq.QuadPart;
   __int64 sec =  i/f;
   sBuf.printf("i/f=%Ld secs", sec);
   Memo1->Lines->Add(sBuf);
   sBuf.printf("%Ld hours", sec/60/60);
   Memo1->Lines->Add(sBuf);
   sBuf.printf("%Ld days", sec/60/60/24);
   Memo1->Lines->Add(sBuf);
   sBuf.printf("%Ld years", sec/60/60/24/365);
   Memo1->Lines->Add(sBuf);


   Memo1->Lines->Add("");

}
//---------------------------------------------------------------------------