1. 程式人生 > >C++中獲得CPU高精度時間戳( 納秒級 )

C++中獲得CPU高精度時間戳( 納秒級 )

對關注效能的程式開發人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程式元件幫助程式設計師精確的控制程式程序,又是一件有力的除錯武器,在有經驗的程式設計師手裡可以儘快的確定程式的效能瓶頸,或者對不同的演算法作出有說服力的效能比較。

  在Windows平臺下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數器,隨系統的不同可以提供微秒級的計數。對於實時圖形處理、多媒體資料流處理、或者實時系統構造的程式設計師,善用QueryPerformanceCount/QueryPerformanceFrequency是一項基本功。

(引用)- -

我們可以在C++中這樣寫:

__declspec (naked) unsigned __int64 GetCpuCycle( void )
{
    _asm
    {
        rdtsc
        ret
    }
}

RDTSC的返回值存放在EDX EAX中, EDX為高32位,EAX為低32位。。。

這裡的__declspec (naked)就不用說了吧。。前面已經提到過。 關鍵是這裡的 RDTSC 指令( Read Time Stamp Counter ), 獲得CPU的高精度時間戳。也可以這樣寫:

__declspec (naked) unsigned __int64 GetCpuCycle( void )
{
    _asm
    {
__asm _emit 0x0F
         __asm _emit 0x31


         ret
    }
}

這樣相當於直接壓入該指令的機器碼。原貼說rdtsc不能在C++內聯彙編編譯器裡面被識別。反正我是可以的,不知道是不是現在編譯器能識別這個的原因,這裡不討論這個 - -

這樣以來我們就可以在隨處獲得當前的CPU自上電以來的時間週期數了:

unsigned __int64 iCpuCycle = GetCpuCycle();

根據這個數字我們可以計算出上電以來所經歷的時間( 秒s ):

second = iCpuCycle / CPU主頻率( HZ );

1GHZ = 1,000 MHZ = 1,000,000 KHZ = 1,000,000,000 HZ;

完全可以放心一個unsigned __int64 不會溢位 - - 你可以計算一下你的CPU能儲存多少年的時間。。

根據這一方法有幾個好處: 一是精度高,二是函式呼叫開銷最小,三是平臺限制小,四是具有和CPU主頻相對應的直接關係。。。 但是由於精度高,得到的數字浮動比較大。。

有了這樣一個計時器,一些實時的處理就更精準了。。。。 - -