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(""); } //--------------------------------------------------------------------------- |
'프로그래밍' 카테고리의 다른 글
C소스의 전체 컴파일 과정 (0) | 2009.10.15 |
---|---|
스레드 종료(TerminateThread API)에 대해서... ] (0) | 2009.10.09 |
객체지향 설계의 원칙 SOLID (1) | 2009.10.09 |
C언어 연산자 우선순위 (0) | 2009.10.01 |
CPU 점유율 표시하기 (0) | 2009.09.22 |