(AHK)(AutoHotkey)(GetTickCount と timeGetTime の 精度対決 編)

 一番最初に書いた内容に不備な点がありましたので 2009年05月16日22時35分付けで 修正しました

 まぁ 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の圧勝ですね