2010年07月09日
[VBA]短絡評価 処理速度の変化について
下記は、条件判定の行い方により速度が変わるというサンプルです。
[前提条件]
1.3の倍数、3が付く数字であるかを判定。
2.4の倍数の時は、評価しない。
※ 3が付く数字の評価では、2秒の待機を行っています。
[比較条件]
サンプルA 3つの判定を同時に行っています。
サンプルB 4の倍数であるかの判定を行った後、
3の倍数、3が付く数字であるかを判定。
******************************
Option Explicit
'Win32 API Sleep関数を有効にする。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'メイン関数(実行する関数)
Public Sub Main()
Const MAX_NUM = 12 '最大ループ回数
Dim i As Long 'ループカウンター
Dim lngCnt As Long '対象カウンタ
Debug.Print ("")
Debug.Print ("短絡評価の有無による速度低下について")
Debug.Print ("( 値が、3の倍数、3が付く数字であるかを判定 ")
Debug.Print (" ただし、4の倍数の時は、評価しない。)")
lngCnt = 0
Debug.Print ("")
Debug.Print (" A:短絡評価しない時 ")
Debug.Print (" ・開始時刻:" & Time)
For i = 1 To MAX_NUM
If (blnThirtieCheck(i) = False) And (blnThreeCheck(i) _
Or blnThreeNumCheck(i)) Then
lngCnt = lngCnt + 1
End If
Next
Debug.Print (" ・終了時刻:" & Time)
Debug.Print (" (処理結果 = " & lngCnt & ") ")
Debug.Print ("")
lngCnt = 0
Debug.Print (" B:短絡評価した時")
Debug.Print (" ・開始時刻:" & Time)
For i = 1 To MAX_NUM
If (blnThirtieCheck(i) = False) Then
If blnThreeCheck(i) Then
lngCnt = lngCnt + 1
ElseIf blnThreeNumCheck(i) Then
lngCnt = lngCnt + 1
End If
End If
Next
Debug.Print (" ・終了時刻:" & Time)
Debug.Print (" (処理結果 = " & lngCnt & ") ")
Debug.Print ("")
End Sub
'引数が、4で割り切れる数字かをチェックする。
Private Function blnThirtieCheck(ByVal num As Long) As Boolean
blnThirtieCheck = False
If num > 0 Then
If num Mod 4 = 0 Then
blnThirtieCheck = True
End If
End If
End Function
'引数が、3で割り切れる数字かをチェックする。
Private Function blnThreeCheck(ByVal num As Long) As Boolean
blnThreeCheck = False
If num > 0 Then
If num Mod 3 = 0 Then
blnThreeCheck = True
End If
End If
End Function
'引数が、3が付く数字かをチェックする。
Private Function blnThreeNumCheck(ByVal num As Long) As Boolean
blnThreeNumCheck = False
If num > 0 Then
If InStr(CStr(num), "3") > 0 Then
blnThreeNumCheck = True
End If
End If
Sleep (2000) 'スリープ 2秒
End Function
******************************
[サンプルの実行の仕方]
1.上記の *** で囲まれた内容をコピペし、エクセルマクロ(クラスorモジュール)へ
貼り付けます。
2.マクロ又は、Visual Basic Editer で実行を行ってください。
3.処理結果が、「イミディエイト」ウインドウに表示されます。
※「イミディエイト」ウインドウは、
マクロ→Visual Basic Editer →表示→イミディエイトウインドウより表示。
![[VBA]短絡評価 処理速度の変化について](//img01.ti-da.net/usr/itpoino/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1.PNG)
[前提条件]
1.3の倍数、3が付く数字であるかを判定。
2.4の倍数の時は、評価しない。
※ 3が付く数字の評価では、2秒の待機を行っています。
[比較条件]
サンプルA 3つの判定を同時に行っています。
サンプルB 4の倍数であるかの判定を行った後、
3の倍数、3が付く数字であるかを判定。
******************************
Option Explicit
'Win32 API Sleep関数を有効にする。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'メイン関数(実行する関数)
Public Sub Main()
Const MAX_NUM = 12 '最大ループ回数
Dim i As Long 'ループカウンター
Dim lngCnt As Long '対象カウンタ
Debug.Print ("")
Debug.Print ("短絡評価の有無による速度低下について")
Debug.Print ("( 値が、3の倍数、3が付く数字であるかを判定 ")
Debug.Print (" ただし、4の倍数の時は、評価しない。)")
lngCnt = 0
Debug.Print ("")
Debug.Print (" A:短絡評価しない時 ")
Debug.Print (" ・開始時刻:" & Time)
For i = 1 To MAX_NUM
If (blnThirtieCheck(i) = False) And (blnThreeCheck(i) _
Or blnThreeNumCheck(i)) Then
lngCnt = lngCnt + 1
End If
Next
Debug.Print (" ・終了時刻:" & Time)
Debug.Print (" (処理結果 = " & lngCnt & ") ")
Debug.Print ("")
lngCnt = 0
Debug.Print (" B:短絡評価した時")
Debug.Print (" ・開始時刻:" & Time)
For i = 1 To MAX_NUM
If (blnThirtieCheck(i) = False) Then
If blnThreeCheck(i) Then
lngCnt = lngCnt + 1
ElseIf blnThreeNumCheck(i) Then
lngCnt = lngCnt + 1
End If
End If
Next
Debug.Print (" ・終了時刻:" & Time)
Debug.Print (" (処理結果 = " & lngCnt & ") ")
Debug.Print ("")
End Sub
'引数が、4で割り切れる数字かをチェックする。
Private Function blnThirtieCheck(ByVal num As Long) As Boolean
blnThirtieCheck = False
If num > 0 Then
If num Mod 4 = 0 Then
blnThirtieCheck = True
End If
End If
End Function
'引数が、3で割り切れる数字かをチェックする。
Private Function blnThreeCheck(ByVal num As Long) As Boolean
blnThreeCheck = False
If num > 0 Then
If num Mod 3 = 0 Then
blnThreeCheck = True
End If
End If
End Function
'引数が、3が付く数字かをチェックする。
Private Function blnThreeNumCheck(ByVal num As Long) As Boolean
blnThreeNumCheck = False
If num > 0 Then
If InStr(CStr(num), "3") > 0 Then
blnThreeNumCheck = True
End If
End If
Sleep (2000) 'スリープ 2秒
End Function
******************************
[サンプルの実行の仕方]
1.上記の *** で囲まれた内容をコピペし、エクセルマクロ(クラスorモジュール)へ
貼り付けます。
2.マクロ又は、Visual Basic Editer で実行を行ってください。
3.処理結果が、「イミディエイト」ウインドウに表示されます。
※「イミディエイト」ウインドウは、
マクロ→Visual Basic Editer →表示→イミディエイトウインドウより表示。

[てぃーだブログ広告]
Posted by Riichi at 21:16
│Comments(0)
│VB・VBA関連