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;

}