C言語 - VC 高性能タイマ - QueryPerformanceCounter
- 1. QueryPerformanceCounter
1. QueryPerformanceCounter
動作している CPU の周波数単位でカウンタを使用します。
LONGLONG freq = 0;
LONGLONG step[2] = {};
::QueryPerformanceFrequency((LARGE_INTEGER *)&freq);
::QueryPerformanceCounter((LARGE_INTEGER *)&step[0]);
Sleep(1000);
::QueryPerformanceCounter((LARGE_INTEGER *)&step[1]);
printf("Sleep にかかった時間 [%lf]msec\n", freq, (double)(step[1]-step[0]) * 1000.0 / freq);
::QueryPerformanceFrequency で取得している値が、CPU の周波数。
1秒間に何かい刻むかという、CPU クロックともいわれている値です。
で、そのカウンタが何回目かというのを取得するのが ::QueryPerformanceCounter になります。
ある処理にかかったカウンタの値を周波数で割れば、秒単位の時間が計算できるわけです。
このソースでは 1000 をかけているので msec 単位となるわけです。
ちなみに i7-6500U 2.50GHz 2.59GHz で、::QueryPerformanceFrequency を取得すると 2,531,250 でした。
2,531,250 / (1000 × 1000) ≒ 2.41 なので実行時のクロックはほんの少し落ちる?
このマシンの仮想環境(VMWare 上)で、コンピュータのプロパティを見るとプロセッサの数値は同じですが、::QueryPerformanceFrequency の値は 10,000,000 でした。
|
|