英吋 C++

高精度計時器

我想,大多數的人都只用到 GetTickCount 這個函式吧?
(好啦!只有我是這樣啦!
我在書上看過的也只有它咩…(畫圓圈)

除了 GetTickCount 之外,最常用的應該就是 timeGetTime QueryPerformanceCounter 吧!
這三種的精準度眾說紛紜,在我電腦上對
GetTickCount timeGetTime 做出來的準度都在 1ms
至於
QueryPerformanceCounter 就很明顯的可以到毫毫…秒(這是誇示法
所以準到哪裡就看個人吧~

1.
timeGetTime

    和 GetTickCount 資料型態都是 DWORD 用法也很簡單
    但是,需要包含
<mmsystem.h> 和連結 winmm.lib
    連結的方式嘛~
    (1)加入程式碼
            #pragma comment(lib,"winmm.lib")

    (2)從VC裡面調整
          專案(P) → 屬性(P) → 組態屬性 → 連結器 → 輸入 → 其他相依性
          加入 winmm.lib 即可

    有部份文章提到另外兩個搭配使用的函數 timeBeginPeriod timeEndPeriod
    好像是可以調整精確度的,但是我電腦上測試沒反應
    所以這邊就不另作說明哩!

    一個簡單的 Delay 函數:

    void DelayByGetTime(DWORD delay)
    {
        timeBeginPeriod(100);

        DWORD TempTime, StartTime, DelayTime;

        DelayTime = delay;

        StartTime = timeGetTime();
        cout << "起始: " << StartTime << endl;

        do
        {
            TempTime = timeGetTime();

            if (TempTime < StartTime)
                StartTime = TempTime;

        } while( (TempTime StartTime) < DelayTime );

        cout << "結束: " << TempTime << endl;

        timeEndPeriod(100);
    }

2. QueryPerformanceCounter
   
    這個計時器是隨著系統有著不同的精準度
    而
QueryPerformanceCounter 使用的資料型態是 LARGE_INTEGER

    LARGE_INTEGER 裡便包含了:
    LowPart
        Low-order 32 bits.
    HighPart
        High-order 32 bits.
    u
        LowPart
            Low-order 32 bits.
        HighPart
            High-order 32 bits.
    QuadPart
        Signed 64-bit integer.
   
    如果編譯器支援 64-bit ,就使用
QuadPart 。不支援時,使用 LowPart 和 HighPart 去表示 QuadPart
    (不太確定是不是這意思,詳見 LARGE_INTEGER

    QueryPerformanceCounter 通常要和 QueryPerformanceFrequency 才能計算時間
   
QueryPerformanceCounter 取得到目前為止的次數
   
QueryPerformanceFrequency 取得計時器的頻率(次數/秒),目前我的是 3579545 次/秒
    照這樣計算的話,大概可以計算到毫毫秒了吧XD

    int main(void)
    {
        LARGE_INTEGER ThisTime, ThatTime, PinTime;

        QueryPerformanceFrequency(&PinTime);

        QueryPerformanceCounter(&ThisTime);
   
        Sleep(1111);

        QueryPerformanceCounter(&ThatTime);

        cout << "起始值: " << ThisTime.QuadPart << endl;
        cout << "結束值: " << ThatTime.QuadPart << endl;
        cout << "差值: " << ThatTime.QuadPart ThisTime.QuadPart << endl;
        cout << "秒: " << (ThatTime.QuadPartThisTime.QuadPart) / PinTime.QuadPart << endl;
        PinTime.QuadPart /= 1000;
        cout << "毫秒: " << (ThatTime.QuadPart ThisTime.QuadPart) / PinTime.QuadPart << endl;
        PinTime.QuadPart
/= 1000;
        cout << "毫毫秒: " << (ThatTime.QuadPart ThisTime.QuadPart) / PinTime.QuadPart << endl;

        system("pause");
        return 0;
    }

◎參考:


哎呀~在這樣下去我啥時才能寫完程式啊

2則迴響

  1. 之前我也有學過一些計時器用法 但是在看了你的這個之後 只有一個感想 就是要背好多東西= = 以下提供我學的方法 #include <iostream.h> #include <time.h> int main() { clock_t start, end; float i,sum=0; start = clock(); for (i=2;i<=10000000;i+=2) sum +=i; end = clock(); cout<<"The time 2+4+…+10000000=" << sum << " was:"<< (end – start) <<" ticks"; cout << endl; } /* clock_t是一滴答(tick)數,1000個ticks為一秒,故一常數CLK_TCK之值為1000,要求兩事件 間時間差需以CLK_TCK除之 */

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.