windowsで使える各種時間取得関数の精度まとめ
先に結論
各関数の分解能*1は以下の通り
メソッド名 | 分解能 |
---|---|
getLocalTime | 10ms程度 |
timeGetTime | 1ms単位で指定 |
QueryPerformanceCounter | 1秒毎の取得回数をLARGE_INTEGER(64bit int)で指定 |
経緯
getLocalTimeでアプリの性能計測していた所、1ms単位のシビアな計測箇所で、開始時刻と終了時刻が同一の場合があった。
複数スレッドでgetLocalTimeしていた為、スレッドが原因と勘違いし、調査に時間を浪費。
MSDNに分解能をちゃんと書いてくれ…。
getLocalTime
10ms程度の誤差が出る模様(分解能が10ms?)0.1秒単位の精度でよいなら、これを使ってOK。
ついでに言うとsleepも同様の精度らしいです。
TimeGetime
最初にtimeBeginPeriodで1ms単位で分解能を指定。
- timeBeginPeriod(1)で、分解能1ms。
- デフォルトの分解能は、Win9xで1ms。NT系では5ms以上。
TimeGetimeは、DWORD(32ビット符号なし整数(unsigned long型))で、OS起動からの経過時間(ミリ秒)を返す。
その為、49日程度でリセットされるので、長時間起動時に注意。
QueryPerformanceCounter
マイクロ秒単位の制度で経過時間の取得が可能。
ただし、今回はそこまで求めていないので割愛。
参考
すみっこのメモ - Win32環境で時間を計るときのあれこれ
- 各種方法での時間取得の実装例
GetTickCount, timeGetTime等の精度について
- GetTickCountとtimeGetTimeの精度比較
timeGetTimeの方がいろいろとめんどくさくないみたい。
- timeGetTimeの実装例と、GetTickCountとの簡単な負荷の比較
そんな感じー。
*1:時刻を再取得する周期