❶ 如何在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可以完成各種任務,如處理用戶輸入、執行應用程序、管理文件系統等。