システム時刻をミリ秒単位で取得(T)          <TOP>


システム時刻をミリ秒単位で取得します。システム時刻は Windows が起動してから経過した時間です。

timeGetTime システムが起動してからの起動時間を取得

timeBeginPeriod アプリケーションまたはデバイスドライバの最小タイマ分解能を設定
timeEndPeriod 以前にセットされた最小タイマ分解能をクリア
 

計算では常に、2 つの timeGetTime関数の戻り値の差を使います。

精度は95系では1ms、NT系では5msだそうです。

NT系の精度を上げる場合timeGetTimeの開始タイマサービスの使用直前に timeBeginPeriod を呼び出し、タイマサービスの使用終了後ただちに timeEndPeriod 関数を呼び出すそうです。

例では、for 〜 next および、while 〜 wend で 10000000回の空ループの時間を計測しています。

計測マシンはAMD/946MHzでの値です。

  

参照URL(2005/05/06現在)

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpmltimd/html/_win32_timegettime.asp

 

'================================================================
'= システム時刻をミリ秒単位で取得
'=    (timeGetTime.bas)
'================================================================
#include "Windows.bi"

' システムが起動してからの起動時間を取得
Declare Function Api_timeGetTime& Lib "winmm" Alias "timeGetTime" ()

' アプリケーションまたはデバイスドライバの最小タイマ分解能を設定
Declare Function Api_timeBeginPeriod& Lib "winmm" Alias "timeBeginPeriod" (ByVal uPeriod&)

' 以前にセットされた最小タイマ分解能をクリア
Declare Function Api_timeEndPeriod& Lib "winmm" Alias "timeEndPeriod" (ByVal uPeriod&)

Var Shared Text1 As Object
Var Shared Radio1 As Object
Var Shared Radio2 As Object
Var Shared Button1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Radio1.Attach GetDlgItem("Radio1") : Radio1.SetFontSize 14
Radio2.Attach GetDlgItem("Radio2") : Radio2.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function Index bdecl () As Integer
Function Index()
    Index = Val(Mid$(GetDlgRadioSelect("Radio1"), 6)) - 1
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var i As Long
    Var Ret As Long

    Text1.SetWindowText "10000000回の空ループ"
    SetMousePointer 2

    '開始時間取得
    Ret = Api_timeBeginPeriod(1)
    nStart = Api_timeGetTime()

    '空ループ
    If Index = 0 Then
        For i = 0 To 10000000 : Next
    Else
        i = 0
        While i <= 10000000
            i = i + 1
        Wend
    End If

    ' 完了時間取得
    nEnd = Api_timeGetTime()
    Ret = Api_timeEndPeriod(1)

    ' 処理結果出力
    Text1.SetWindowText Str$((CDbl(nEnd) - CDbl(nStart)) / 1000) & "秒かかりました。"
    SetMousePointer 0
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End