導航:首頁 > 程序命令 > 程序員做的時鍾代碼

程序員做的時鍾代碼

發布時間:2025-01-08 02:15:36

❶ 如何在C++中如何編寫得到微妙單位的時間的代碼

網路, ctrlc, ctrlv。。。

c++ 毫秒,微妙級計時方法
在Windows平台下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數器,隨系統的不同可以提供微秒級的計數。對於實時圖形處理、多媒體數據流處理、或者實時系統構造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項基本功。
在Intel Pentium以上級別的CPU中,有一個稱為「時間戳(Time Stamp)」的部件,它以64位無符號整型數的格式,記錄了自CPU上電以來所經過的時鍾周期數。由於目前的CPU主頻都非常高,因此這個部件可以達到納秒級的計時精度。這個精確性是上述兩種方法所無法比擬的。
在Pentium以上的CPU中,提供了一條機器指令RDTSC(Read Time Stamp Counter)來讀取這個時間戳的數字,並將其保存在EDX:EAX寄存器對中。由於EDX:EAX寄存器對恰好是Win32平台下C++語言保存函數返回值的寄存器,所以我們可以把這條指令看成是一個普通的函數調用。像這樣:

inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}

但是不行,因為RDTSC不被C++的內嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機器碼形式0X0F、0X31,如下:

inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}

以後在需要計數器的場合,可以像使用普通的Win32 API一樣,調用兩次GetCycleCount函數,比較兩個返回值的差,像這樣:

unsigned long t;
t = (unsigned long)GetCycleCount();
//Do Something time-intensive ...
t -= (unsigned long)GetCycleCount();
這個方法的優點是:
1.高精度。可以直接達到納秒級的計時精度(在1GHz的CPU上每個時鍾周期就是一納秒),這是其他計時方法所難以企及的。
2.成本低。timeGetTime 函數需要鏈接多媒體庫winmm.lib,QueryPerformance* 函數根據MSDN的說明,需要硬體的支持(雖然我還沒有見過不支持的機器)和KERNEL庫的支持,所以二者都只能在Windows平台下使用(關於DOS平台下的高精度計時問題,可以參考《圖形程序開發人員指南》,裡面有關於控制定時器8253的詳細說明)。但RDTSC指令是一條CPU指令,凡是i386平台下Pentium以上的機器均支持,甚至沒有平台的限制(我相信i386版本UNIX和Linux下這個方法同樣適用,但沒有條件試驗),而且函數調用的開銷是最小的。
3.具有和CPU主頻直接對應的速率關系。一個計數相當於1/(CPU主頻Hz數)秒,這樣只要知道了CPU的主頻,可以直接計算出時間。這和QueryPerformanceCount不同,後者需要通過QueryPerformanceFrequency獲取當前計數器每秒的計數次數才能換算成時間。

這個方法的缺點是:
1.現有的C/C++編譯器多數不直接支持使用RDTSC指令,需要用直接嵌入機器碼的方式編程,比較麻煩。
2.數據抖動比較厲害。其實對任何計量手段而言,精度和穩定性永遠是一對矛盾。如果用低精度的timeGetTime來計時,基本上每次計時的結果都是相同的;而RDTSC指令每次結果都不一樣,經常有幾百甚至上千的差距。這是這種方法高精度本身固有的矛盾。

下面是幾個小例子,簡要比較了三種計時方法的用法與精度
//Timer1.cpp 使用了RDTSC指令的Timer類//KTimer類的定義可以參見《Windows圖形編程》P15
//編譯行:CL Timer1.cpp /link USER32.lib
#include <stdio.h>
#include "KTimer.h"
main()
{
unsigned t;
KTimer timer;
timer.Start();
Sleep(1000);
t = timer.Stop();
printf("Lasting Time: %d\n",t);
}

//Timer2.cpp 使用了timeGetTime函數
//需包含<mmsys.h>,但由於Windows頭文件錯綜復雜的關系
//簡單包含<windows.h>比較偷懶:)
//編譯行:CL timer2.cpp /link winmm.lib
#include <windows.h>
#include <stdio.h>

main()
{
DWORD t1, t2;
t1 = timeGetTime();
Sleep(1000);
t2 = timeGetTime();
printf("Begin Time: %u\n", t1);
printf("End Time: %u\n", t2);
printf("Lasting Time: %u\n",(t2-t1));
}

//Timer3.cpp 使用了QueryPerformanceCounter函數
//編譯行:CL timer3.cpp /link KERNEl32.lib
#include <windows.h>
#include <stdio.h>

main()
{
LARGE_INTEGER t1, t2, tc;
QueryPerformanceFrequency(&tc);
printf("Frequency: %u\n", tc.QuadPart);
QueryPerformanceCounter(&t1);
Sleep(1000);
QueryPerformanceCounter(&t2);
printf("Begin Time: %u\n", t1.QuadPart);
printf("End Time: %u\n", t2.QuadPart);
printf("Lasting Time: %u\n",( t2.QuadPart- t1.QuadPart));
}

❷ cpu主要看什麼參數

cpu的性能指標是:主頻、外頻。

1、主頻:主頻也就是CPU的時鍾頻率,也是cpu的性能指標。簡單地說也就是CPU的工作頻率。一般說來,一個時鍾周期完成的指令數是固定的,所以主頻越高,CPU的速度也就越快了。不過由於各種CPU的內部結構也不盡相同,所以並不能完全用主頻來概括CPU的性能。

cpu的作用

1、執行計算:CPU最基本的功能是執行各種算術和邏輯運算。例如,加法、減法、乘法、除法、冪運算等。這些運算可以是簡單的數學計算,也可以是復雜的科學計算和工程計算。

2、控制和協調:CPU負責管理計算機系統中的各個組件,如內存、輸入/輸出設備、網路介面等。它通過與這些組件進行通信和交互,協調它們的工作,並確保系統的穩定性和可靠性。

3、執行指令:CPU通過執行一系列指令來執行計算和數據處理任務。這些指令可以是程序員編寫的程序或操作系統內核的代碼。通過執行指令,CPU可以完成各種任務,如處理用戶輸入、執行應用程序、管理文件系統等。

閱讀全文

與程序員做的時鍾代碼相關的資料

熱點內容
vf命令編號 瀏覽:574
怎麼解決excel編譯錯誤 瀏覽:939
什麼電視app可以免費看戲曲 瀏覽:929
圖形界面登陸linux 瀏覽:856
python簡單還是php簡單 瀏覽:216
華為方舟編譯器首秀大牛力捧 瀏覽:635
cxf動態編譯問題 瀏覽:727
特斯拉密鑰怎麼加密 瀏覽:319
opencv3forlinux 瀏覽:683
編譯器中掃描器的任務是 瀏覽:537
馬上消費金融app是什麼時候出來的 瀏覽:494
程序編譯成功但運行不了 瀏覽:482
北京程序員的一天望京soho 瀏覽:669
小程序怎麼保存編譯 瀏覽:766
linuxhba卡驅動 瀏覽:544
2016證券從業資格教材pdf 瀏覽:389
windows系統pdf 瀏覽:354
伺服器機箱如何干擾信號 瀏覽:366
android引用系統資源文件 瀏覽:986
伺服器虛擬機操作系統下載地址 瀏覽:947