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

來源:互聯網
上載者:User

解釋:

高精度延時, 是 CPU 測速的基礎 Windows 內部有一個精度非常高的定時器, 精度在微秒級, 但不同的系統這個定時器的頻率不同, 這個頻率與硬體和作業系統都可能有關。 利用 API 函數 QueryPerformanceFrequency 可以得到這個定時器的頻率。 利用 API 函數 QueryPerformanceCounter 可以得到定時器的當前值。 根據要延時的時間和定時器的頻率, 可以算出要延時的時間定時器經過的周期數。 在迴圈裡用 QueryPerformanceCounter 不停的讀出定時器值,
一直到經過了指定周期數再結束迴圈, 就達到了高精度延時的目的。 高精度延時的程式, 參數: 微秒 二.測速程式 利用 rdtsc 彙編指令可以得到 CPU 內部定時器的值, 每經過一個 CPU 週期, 這個定時器就加一。 如果在一段時間內數得 CPU 的周期數, CPU工作頻率 = 周期數 / 時間 為了不讓其他進程和線程打擾, 必需要設定最高的優先順序 以下函數設定當前進程和線程到最高的優先順序。 SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL) CPU 測速程式的原始碼, 這個程式通過 CPU 在 1/16 秒的時間內經過的周期數計算出工作頻率, 單位 MHz。

高精度延時:

void DelayUs(__int64 Us){    LARGE_INTEGER CurrTicks, TicksCount;     QueryPerformanceFrequency(&TicksCount);    QueryPerformanceCounter(&CurrTicks);     TicksCount.QuadPart = TicksCount.QuadPart * Us / 1000000i64;    TicksCount.QuadPart += CurrTicks.QuadPart;     while(CurrTicks.QuadPart<TicksCount.QuadPart)        QueryPerformanceCounter(&CurrTicks);}

測速程式:

int CPU_Frequency(void) //MHz{    LARGE_INTEGER CurrTicks, TicksCount;    __int64 iStartCounter, iStopCounter;    DWORD dwOldProcessP = GetPriorityClass(GetCurrentProcess());    DWORD dwOldThreadP = GetThreadPriority(GetCurrentThread());    SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);    QueryPerformanceFrequency(&TicksCount);    QueryPerformanceCounter(&CurrTicks);    TicksCount.QuadPart /= 16;    TicksCount.QuadPart += CurrTicks.QuadPart;    asm rdtsc    asm mov DWORD PTR iStartCounter, EAX    asm mov DWORD PTR (iStartCounter+4), EDX    while(CurrTicks.QuadPart<TicksCount.QuadPart)        QueryPerformanceCounter(&CurrTicks);    asm rdtsc    asm mov DWORD PTR iStopCounter, EAX    asm mov DWORD PTR (iStopCounter + 4), EDX    SetThreadPriority(GetCurrentThread(), dwOldThreadP);    SetPriorityClass(GetCurrentProcess(), dwOldProcessP);    return (int)((iStopCounter-iStartCounter)/62500);} //前面是用 API 函數進行延時, 如果知道了 CPU 的工作頻率, 利用迴圈, 也可以得到高精度的延時int _CPU_FREQ = 0; //定義一個全域變數儲存 CPU 頻率 (MHz)void CpuDelayUs(__int64 Us) //利用迴圈和 CPU 的頻率延時, 參數: 微秒{    __int64 iCounter, iStopCounter;    asm rdtsc    asm mov DWORD PTR iCounter, EAX    asm mov DWORD PTR (iCounter+4), EDX    iStopCounter = iCounter + Us*_CPU_FREQ;    while(iStopCounter-iCounter>0)    {        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 秒鐘} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.