(AHK)(AutoHotkey)(GetTickCount と timeGetTime の 精度対決 編)
一番最初に書いた内容に不備な点がありましたので 2009年05月16日22時35分付けで 修正しました
まぁ timeGetTimeが勝つという 結果ありきの 対決なんですが 笑)
一応 AutoHotkeyでも 対決させてみました
これをやらないと 差はほとんど出ません
一種のおまじないと思ってください 笑)
私のPCの場合(WinXpPro 32bit SP3 C2D1.8Ghz Mem1GByte)はこういう結果に
上のほうが GetTickCountの場合 下のほうが timeGetTimeの場合です
左の数値が 1ms以上の差異を 感知するまでに ループした回数です
右の数値が 1ms以上の差異を感知した時の 前回の時間との差です
右の数値が 1に近い方が 理想的な結果となります
timeGetTimeの値がちゃんと更新されてない時も たまにあるようですね
一抹の不安要素はありますが まぁ 結果を見れば timeGetTimeの圧勝ですね
まぁ timeGetTimeが勝つという 結果ありきの 対決なんですが 笑)
一応 AutoHotkeyでも 対決させてみました
{ api_timeBeginPeriod(1) Sleep, 1000 buf := "-------------------`n" Loop, 30 { tc := api_GetTickCount() Loop { dt := api_GetTickCount() - tc If ( dt >= 1) { buf .= A_Index . " " . dt . "`n" Break } } } buf .= "-------------------`n" Sleep, 1000 Loop, 30 { tc := api_timeGetTime() Loop { dt := api_timeGetTime() - tc If ( dt >= 1) { buf .= A_Index . " " . dt . "`n" Break } } } api_timeEndPeriod(1) MsgBox,% buf ExitApp } ;------------------------------------------------------------------------------------------------------------------------------------ ; api_GetTickCount ;------------------------------------------------------------------------------------------------------------------------------------ ; DWORD GetTickCount(VOID); api_GetTickCount() { Return DllCall("kernel32.dll\GetTickCount", "UInt") } ;------------------------------------------------------------------------------------------------------------------------------------ ; api_timeGetTime ;------------------------------------------------------------------------------------------------------------------------------------ ; DWORD timeGetTime(VOID); api_TimeGetTime() { Return DllCall("winmm.dll\timeGetTime", "UInt") } ;------------------------------------------------------------------------------------------------------------------------------------ ; api_timeBeginPeriod ;------------------------------------------------------------------------------------------------------------------------------------ ; MMRESULT timeBeginPeriod(UINT uPeriod); api_timeBeginPeriod(uPeriod) { Return DllCall("winmm.dll\timeBeginPeriod", "UInt", uPeriod, "UInt") } ;------------------------------------------------------------------------------------------------------------------------------------ ; api_timeEndPeriod ;------------------------------------------------------------------------------------------------------------------------------------ ; MMRESULT timeEndPeriod(UINT uPeriod); api_timeEndPeriod(uPeriod) { Return DllCall("winmm.dll\timeEndPeriod", "UInt", uPeriod, "UInt") } ;------------------------------------------------------------------------------------------------------------------------------------注意 : timeBeginPeriod(1)で 精度を1msに設定、 timeEndPeriod(1)で それを解除してます
これをやらないと 差はほとんど出ません
一種のおまじないと思ってください 笑)
私のPCの場合(WinXpPro 32bit SP3 C2D1.8Ghz Mem1GByte)はこういう結果に
上のほうが GetTickCountの場合 下のほうが timeGetTimeの場合です
左の数値が 1ms以上の差異を 感知するまでに ループした回数です
右の数値が 1ms以上の差異を感知した時の 前回の時間との差です
右の数値が 1に近い方が 理想的な結果となります
timeGetTimeの値がちゃんと更新されてない時も たまにあるようですね
一抹の不安要素はありますが まぁ 結果を見れば timeGetTimeの圧勝ですね