ここではVC++6.0を使ったクロック測定のやり方について説明する。
VC++が使えない人ははじめてのVC++を参照のこと。
1000回の空ループを実行するのに何クロックかかるかを計測してみよう。
#include <stdio.h> int main() { int a; __asm{ rdtsc //タイムスタンプ・カウンタの値をeaxに読み込む mov a,eax //読み込んだ値を変数aに保存しておく mov ecx,1000 //ここから測定対象 lp: dec ecx jnz lp //ここまで測定対象 rdtsc //タイムスタンプ・カウンタの値をeaxに読み込む sub eax,a //新しいカウンタの値eaxから、古い値aを引くと、所要クロックがわかる mov a,eax //それを変数aにコピー } printf("%d\n",a); //aの値を出力 return 0; }
これを実行するとPentiumMでは 1102 と出力される。
PentiumMで空ループの測定をして、1102と出力された。
1ループ当たり1clkと少し、という計算だが、半端な102が何を意味するかがわからない。
そこで測定コードのmov ecx,1000 という部分をmov ecx,10000 と変えて再び実行してみる。
すると10102と出力された。
ここから、半端な102はいつも同じで、それを除けば1ループ当たりちょうど1clkだということが見て取れる。
半端な102clkが謎のままだが、ここでは1ループ1clkという結果が得られただけでよしとしよう。
上のような手法が常に通用するとは限らない。
102という数字も、たまたま一致しただけかもしれない。
なるべく多くのパターンを測定して、よく考えて結論を出さないといけない。