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]短絡評価 処理速度の変化について

人気ブログランキングへ人気ブログランキングへ 記事が参考となりましたら。ブログランキングバナーのクリックをお願いします。




[てぃーだブログ広告]

同じカテゴリー(VB・VBA関連)の記事

上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 3人
QRコード
QRCODE