2009
04
25
22
16
[程式] 再談用 RDTSC 來做performance測量
在網路上看到這一篇Using the RDTSC Instruction for Performance Monitor,
說明了可以使用 rdtsc 這個指令來測量performance,
這在我之前的文章也有說過。
但是不同的地方是,
他有考慮到現今的cpu的設計,
都已經是 out-of-order execution ,
所以,可能會造成你原本要測量的指令還沒有完成,
rdtsc 指令已經先被完成了。
所以文章裡說到可以使用 cpuid 這個指令來強迫先前的指令完成。
理由是,因為 cpuid 執行完成時,
會去修改 EAX, EBX, ECX, EDX ,
這可以迫使絕大多數指令一定要完成。
所以就可以照之前的作法來寫成一個function來執行,
雖然會造成執行上的時間較多。如下:
static unsigned __int64 rdtsc(void) {
__asm cpuid;
__asm rdtsc;
}
理論上就會比之前的作法準確多了。
Update:
這樣寫起來更精簡~
__declspec(naked) static unsigned __int64 rdtsc(void) {
__asm cpuid;
__asm rdtsc;
__asm ret;
}