一、了解RDTSC指令rdtsc指令, 該指令返回CPU自啟動(dòng)以來的時(shí)鐘周期數(shù);該時(shí)鐘周期數(shù),即處理器的時(shí)間戳。 在CPU通電啟動(dòng)后,首先會(huì)重置EDX和EAX,在每個(gè)時(shí)鐘周期上升或下降沿到來時(shí),會(huì)自動(dòng)累計(jì)周期數(shù),并被記錄到EDX和EAX寄存器中,EDX是高位,EAX是低位。 rdtsc指令就是從該寄存器中進(jìn)行獲取的。 周期和頻率的關(guān)系公式:T(周期)=1/f(頻率) 如CPU頻率f為1GHz,則其時(shí)鐘周期T=1/1GHz秒,意味著每隔T秒,CPU完成一個(gè)最基本的動(dòng)作,并在寄存器中,對(duì)周期數(shù)加1。 故,假設(shè)當(dāng)前時(shí)鐘周期數(shù)為m,則可計(jì)算出CPU自啟動(dòng)后,累計(jì)運(yùn)行時(shí)間X=m*T,整理下: X=m/f 時(shí)鐘周期與時(shí)鐘頻率互為倒數(shù), 我們可以找出以下關(guān)系:
注意計(jì)算時(shí),單位要搭配好,比如:
小結(jié):
二、RDTSC指令在win和linux上的實(shí)現(xiàn)我們已經(jīng)知道RDTSC可以獲取CPU運(yùn)行時(shí)間,另外win平臺(tái)上也已經(jīng)有了一個(gè)類似的函數(shù):
該函數(shù)返回值是系統(tǒng)啟動(dòng)后經(jīng)過的毫秒數(shù),最長為49.7天。 其微軟幫助為: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount win和linux下RDTSC的實(shí)現(xiàn)
win下,__rdtsc()函數(shù)的微軟幫助為: https://docs.microsoft.com/zh-cn/cpp/intrinsics/rdtsc?view=vs-2019 linux下,則需要內(nèi)聯(lián)匯編來實(shí)現(xiàn)。 RDTSC指令結(jié)合CPU頻率,也可以用來計(jì)算代碼段的執(zhí)行時(shí)間。 參考鏈接:
|
|