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

  • timeGetTimeの実装例と、GetTickCountとの簡単な負荷の比較


そんな感じー。

*1:時刻を再取得する周期