線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2650
推到 Plurk!
推到 Facebook!

CPU 測速(MHz)和高精度延時(微秒級)

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-14 11:20:26 IP:61.221.xxx.xxx 未訂閱
http://www.cppfans.com/articles/system/cpuspd_usdly.asp
CPU 測速(MHz)和高精度延時(微秒級)    (瀏覽 3009 次)    Victor Chen, (C   愛好者)
一.高精度延時, 是 CPU 測速的基礎
Windows 內部有一個精度非常高的計時器, 精度在微秒級, 但不同的系統這個計時器的頻率不同, 這個頻率與硬體和作業系統都可能有關。    利用 API 函數 QueryPerformanceFrequency 可以得到這個計時器的頻率。
利用 API 函數 QueryPerformanceCounter 可以得到計時器的當前值。
根據要延時的時間和計時器的頻率, 可以算出要延時的時間計時器經過的周期數。
在迴圈裏用 QueryPerformanceCounter 不停的讀出計時器值, 一直到經過了指定周期數再結束迴圈, 就達到了高精度延時的目的。    高精度延時的程式, 參數: 微秒:
void DelayUs(__int64 Us)
{
    LARGE_INTEGER CurrTicks, TicksCount;         QueryPerformanceFrequency(&TicksCount);
    QueryPerformanceCounter(&CurrTicks);         TicksCount.QuadPart = TicksCount.QuadPart * Us / 1000000i64;
    TicksCount.QuadPart  = CurrTicks.QuadPart;         while(CurrTicks.QuadPart0)
    {
        asm rdtsc
        asm mov DWORD PTR iCounter, EAX
        asm mov DWORD PTR (iCounter 4), EDX
    }
}    void TestDelay(void)
{ 
    _CPU_FREQ = CPU_Frequency(); //利用 CPU 頻率初始化定時
    CpuDelayUs(1000000); //延時 1 秒鐘
}
總結:
無論是前面程式中的 DelayUs 函數還是 CpuDelayUs 函數, 實際上的基礎都是 API 函數 QueryPerformanceCounter
如果認d精度不夠, 可以在測試 CPU 頻率時延時更長時間, 但經過我的測試, 1/16秒足夠了, 可以較高精度的測出 CPU 的工作頻率。
程式裏要進行高精度(微秒級)的延時, 完全可以採用 DelayUs 和 CpuDelayUs 函數。     
zhvickie
一般會員


發表:16
回覆:41
積分:11
註冊:2003-05-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-15 13:09:34 IP:137.132.xxx.xxx 未訂閱
这个我测试了,好像达不到
系統時間:2024-04-30 4:23:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!