3. C言語 - VC 高性能タイマ - QueryPerformanceCounter

 
3.1 QueryPerformanceCounter

3.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 でした。