【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