使用rdtsc指令,測量程式的執行速度

2021-07-16 18:25:15 字數 2058 閱讀 9659

**:

最近發現了rdtsc指令,可以獲取cpu指令週期數,喜出望外,wiki了下相關的知識,寫了**利用cpu週期來測量程式的執行時間。

rdtsc指令返回的是自開機始cpu的週期數,返回的是乙個64位的值edx:eax(高32在edx,低32位在eax)。ok,完全可以利用這條指令,測試我們的關注的一段**的執行效率。

題外話,我興沖沖的告訴我老大,我發現了乙個測量程式效能的好辦法,老大淡然的說,不會是rdtsc吧。呵呵我和老大的水平差距還是雲泥之別啊。他告訴我可以去linux kernel檢視核心是如何做的。呵呵,我就照搬了kernel的實現。兼練習以下c和彙編混合程式設計。

在網上搜尋相關的資源看到了陳碩大牛的多核時代不宜再用 x86 的 rdtsc 指令測試指令週期和時間

他給出了幾個理由,有興趣的兄弟可以去讀下。

1多核,不能保證每個核的tsc是一樣的。

2 cpu的時鐘頻率可變

3 亂序執行導致測量不准。

文獻5指出,指令可能亂序執行,並給出個例子,下面的一段**,本意是測量fdiv需要的cpu週期,但是,由於亂序執行,第二個rdtsc指令可能在fdiv之前執行,造成,無法測量fdiv的需要的cpu週期。文獻給出了解決辦法。有興趣的兄弟可以去閱讀參考文獻5.

rdtsc                   ; read time stamp

mov     time, eax       ; move counter into variable

fdiv                    ; floating-point divide

rdtsc                   ; read time stamp

sub     eax, time       ; find the differenc

1   深入理解計算機系統

2   linux kernel code

3   wiki

4   多核時代不宜再用 x86 的 rdtsc 指令測試指令週期和時間

5  

#include

#include

#include

#define times  100

#define size 1024

__u64 rdtsc(

)

int myfunction(

)

else

}

return 0;

}

int test_rdtsc(

)

int main(

)

執行結果如下

root@libin:

~/program/assembly/rdtsc# .

/test

myfunction cost 310949 cpu cycles

timeofday測量程式執行時間

2.時間的測量 有時候我們要計算程式執行的時間.比如我們要對演算法進行時間分析.這個時候可以使用下面這個函式.include int gettimeofday struct timeval tv,struct timezone tz strut timeval gettimeofday將時間儲存在結...

精確測量程式執行時間

作為乙個程式設計師,很多時候都會去關心自己的程式跑的到底有多快,這時就需要對程式的執行時間進行測量。對於不同的程式,它們的執行時間可能相差很大。諸如科學計算類的程式,由於計算量大且演算法的並行化比較差,可能幾天都跑不完。而有的程式的執行時間可能只有幾分鐘甚至不到1ms。不同的時間測量方法,其測量精度...

如何精確測量程式執行時間

在網上找了很久試了很久,感覺這個是最好的,拿出來分享下。bool queryperformancefrequency large integer lpfrequency 返回硬體支援的高精度計數器的頻率。bool queryperformancecounter large integer lpcou...