【VB.Net】関数ベンチマーククラスを作成してみた

はじめに


VB.NetのDelegeteを使って関数の時間計測が簡単にできるようにした。

Public Class clsBenchMarkTest

#Region "【MemberVariable】"
    ''' <summary>
    ''' 関数名
    ''' </summary>
    Private m_strMethodName As String
    ''' <summary>
    ''' 処理時間[ms]
    ''' </summary>
    Private m_dblMilliseconds As Double

    ''' <summary>
    ''' ログの仕切り文字
    ''' </summary>
    Private Shared ReadOnly m_strLine As String = " " & StrDup(10, "="c) & " "

#End Region

#Region "【Property】"
    ''' <summary>
    ''' 関数名
    ''' </summary>
    Public ReadOnly Property MethodName() As String
        Get
            Return m_strMethodName
        End Get
    End Property
    ''' <summary>
    ''' 処理時間[ms]
    ''' </summary>
    Public ReadOnly Property Milliseconds() As String
        Get
            Return m_dblMilliseconds
        End Get
    End Property
#End Region

#Region "【Delegate】"
    ''' <summary>
    ''' Subプロシージャ用デリゲート
    ''' </summary>
    ''' <param name="args"></param>
    Public Delegate Sub delSubProc(<[ParamArray]()> args As Object())
    ''' <summary>
    ''' Functionプロシージャ用デリゲート
    ''' </summary>
    ''' <param name="args"></param>
    ''' <returns></returns>
    Public Delegate Function delFuncProc(<[ParamArray]()> args As Object())
#End Region

#Region "【Shared Method】"
    ''' <summary>
    ''' ベンチマーク 対Functionプロシージャ
    ''' </summary>
    ''' <param name="lngTimes"> 試行回数 </param>
    ''' <param name="strFuncName"> 対象となるFunctionプロシージャ名 </param>
    ''' <param name="funcProc"> 対象となるFunctionプロシージャ </param>
    ''' <param name="Args"> Functionプロシージャの引数 </param>
    ''' <returns></returns>
    Public Shared Function BenchMarkTest(ByVal lngTimes As Long, ByVal strFuncName As String, ByVal funcProc As delFuncProc, ParamArray ByVal Args As Object()) As clsBenchMarkTest
        StartProc(lngTimes, strFuncName)  ' 前処理
        Dim sw As New Stopwatch()

        sw.Start()
        For i = 1 To lngTimes
            funcProc.Invoke(Args)  ' Functionプロシージャの実行
        Next
        sw.Stop()

        Return EndProc(lngTimes, strFuncName, sw)  ' 後処理
    End Function

    ''' <summary>
    ''' ベンチマーク 対Subプロシージャ
    ''' </summary>
    ''' <param name="lngTimes"> 試行回数 </param>
    ''' <param name="strSubName"> 対象となるSubプロシージャ名 </param>
    ''' <param name="subProc"> 対象となるSubプロシージャ </param>
    ''' <param name="Args"> Subプロシージャの引数 </param>
    ''' <returns></returns>
    Public Shared Function BenchMarkTest(ByVal lngTimes As Long, ByVal strSubName As String, ByVal subProc As delSubProc, ParamArray ByVal Args As Object()) As clsBenchMarkTest
        StartProc(lngTimes, strSubName)  ' 前処理
        Dim sw As New Stopwatch()

        sw.Start()
        For i = 1 To lngTimes
            subProc.Invoke(Args)  ' Subプロシージャの実行
        Next
        sw.Stop()

        Return EndProc(lngTimes, strSubName, sw)  ' 後処理
    End Function

    ''' <summary>
    ''' BenchMarkの後処理
    ''' </summary>
    ''' <returns></returns>
    Private Shared Function EndProc(ByVal lngTimes As Long, ByVal strMethodName As String, ByVal sw As Stopwatch) As clsBenchMarkTest

        Console.WriteLine(" - TotalTime : " & sw.ElapsedMilliseconds & "[ms]")
        Console.WriteLine()
        Console.WriteLine(m_strLine & strMethodName & " ---  End  " & m_strLine)
        Console.WriteLine()

        Dim Result As New clsBenchMarkTest()
        Result.m_strMethodName = strMethodName
        Result.m_dblMilliseconds = sw.ElapsedMilliseconds
        Return Result
    End Function

    ''' <summary>
    ''' BenchMarkの前処理
    ''' </summary>
    Private Shared Sub StartProc(ByVal lngTimes As Long, ByVal strMethodName As String)
        Console.WriteLine()
        Console.WriteLine(m_strLine & strMethodName & " --- Start " & m_strLine)
        Console.WriteLine()
        Console.WriteLine(" - MethodName: " & strMethodName)
        Console.WriteLine(" - ProcTimes : " & lngTimes.ToString("#,0"))
    End Sub
#End Region

End Class

更新日時: