1秒 = 1000毫秒 = 1000 000微秒 = 1000 000 000 納秒
大家都知道windows下的時間計數器提供的是毫秒級的時間計數。那麼怎麼提供乙個精度更高的計數器呢。在intel pentium以上級別的cpu中,有乙個稱為「時間戳(time stamp)」的部件,它以64位無符號整型數的格式,記錄了自cpu上電以來所經過的時鐘週期數。對於乙個主頻為1ghz的cpu,則其乙個時鐘週期就是一納秒。由於目前的cpu主頻都非常高,因此這個部件可以達到 納秒級的計時精度。在pentium以上的cpu中,提供了一條機器指令rdtsc(read time stamp counter)來讀取這個時間戳的數字,並將其儲存在edx:eax暫存器對中。由於edx:eax暫存器對恰好是win32平台下c++語言儲存函式 返回值的暫存器,所以我們可以把這條指令看成是乙個普通的函式呼叫。像這樣:
inline unsigned __int64 getcpucyclecount()
如果rdtsc不被c++的內嵌彙編器直接支援,我們還可以要用_emit偽指令直接嵌入該指令的機器碼形式0x0f、0x31,如下:
inline unsigned __int64 getcpucyclecount()
以後在需要計數器的場合,可以像使用普通的win32 api一樣,呼叫兩次getcpucyclecount函式,比較兩個返回值的差,然後利用cpu的時鐘週期的差數就可以計算出乙個納秒級的計時。公式如下
時間 = cpu時鐘週期數差數 / cpu主頻速率(hz)
vc中的實現**如下:
// 納秒 微秒 時間精度的實現
#include
#include
#include
//使用
timegettime()
需要包含此標頭檔案
#pragma
comment
(lib
,"winmm.lib"
)
//使用
timegettime()
需要包含此
lib//
微秒級class
microsecondtimer
inline
void
start
()// 返回微秒
inline
uint64
stop
()
private
:large_integer
freq
;large_integer
startcount
;large_integer
endcount;};
//納秒級
// 連續呼叫start和stop所需的時間大概是62ns
class
nanosecondtimer
//得到計算機啟動到現在的時鐘週期
static
inline
uint64
getcpucyclecount
(void)//
得到cpu
的頻率static
inline
double
calcpufrequency
()inline
void
start
()inline
uint64
stop
()inline
double
frequency
()private
:uint64
startt
;double
frequency
; // mhz/s
};int
main
(int
argc
,char
*argv
)getchar
();return0;}
事實上在windows中每次呼叫**指令的時間都不穩定,所以這是很難真正的精確到納秒級的。windows下最多只能提供微秒級的精確度。
納秒與微秒的計算
秒的換算 ms 毫秒 s 微秒 ns 納秒 ps 皮秒 皮秒皮秒,符號ps 英語 picosecond 1皮秒等於一萬億分之一秒 10 12秒 1,000 皮秒 1納秒 1,000,000 皮秒 1微秒 1,000,000,000 皮秒 1毫秒 1,000,000,000,000 皮秒 1秒 納秒納...
時間單位的換算(秒,毫秒,微秒,納秒,皮秒)
秒 second 時間單位 s,毫秒 millisecond 時間單位 ms 微秒 microsecond 時間單位 s 1s 秒 1000ms 毫秒 1ms 毫秒 1000 s 微秒 1 s 微秒 1000ns 納秒 1ns 納秒 1000ps 皮秒 1秒 s 1000 毫秒 ms 1,000,0...
C 時間工具類 納秒,微秒,毫秒,秒,日期
1 找乙個比較全的時間工具類太難了,沒人總結啊 適用於linux include include include include include using std string linux高精度struct timespec 精確到納秒 和struct timeval 精確到微秒 class ti...