C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[881] 고정밀도의 정확한 시간차 구하기 함수:
김태선 [cppbuilder] 10090 읽음    2009-03-29 02:29
매우 정확한 시간차를 구해야 할 때 사용할 수 있는 함수입니다.
사용의 편의에 초점을 맞춰 함수를 구성했습니다.
방법은 널리 알려진 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);
}
//---------------------------------------------------------------------------


잘 하면 타이머로도 활용 가능하겠죠.
김태선 [cppbuilder]   2009-03-29 04:04 X
보통 ms 정도의 정밀도에 간편하면서도 정확하게 시간을 측정할때는
다음과 같은 방법도 많이 쓰입니다.

#include <mmsystem.h>

    // CPU 자원 최대 사용하도록 준비.
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    // 시간 측정 준비
    timeBeginPeriod(1);

    DWORD starttime = timeGetTime();
    //
    // 어떤 작업
    //
    DWORD endtime = timeGetTime();

    // 시간 측정. ms 단위.
    DWORD timebetween = endtime - starttime;

    // 종료
    timeEndPeriod(1);

+ -

관련 글 리스트
881 고정밀도의 정확한 시간차 구하기 함수: 김태선 10090 2009/03/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.