**:
最近發現了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...