2009/05/11

空文字チェック対決-VBA編

VBAで空文字("")をチェックするときの速度1千万回対決。とりあえず、Nullは空文字ではないので除外。

結果

strData = "あいうえおかきくけこさしすせそ"
If strData = "" Then          :517 ミリ秒
If Len(strData) = 0 Then      :230 ミリ秒
If LenB(strData) = 0 Then     :234 ミリ秒

strData = "0123456789abcdefg"
If strData = "" Then          :516 ミリ秒
If Len(strData) = 0 Then      :270 ミリ秒
If LenB(strData) = 0 Then     :234 ミリ秒

※LenとLenBの速度差は、なんだか色々フクザツです。

strDataに「あいうえお」等が入っていると、Len/LenBの速度差の順位は、状況によってはひっくりかえったりしてマチマチ。「0123abcd」などの文字列のときは、何度やってもにLenBが早くなります。何故かはいまのところ不明。

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

  1. Dim ClsTimerMM As ClsTimerMM  
  2. Dim strTextMsg As String  
  3. '************************  
  4. Dim strData As String  
  5. Dim strGet As String  
  6. Dim lngMax As Long  
  7. Dim i As Long  
  8. '************************  
  9. Set ClsTimerMM = New ClsTimerMM  
  10. strData = "あいうえおかきくけこさしすせそ"  
  11. 'strData = "0123456789abcdefg"  
  12. strTextMsg = "strData:" & strData & vbCrLf  
  13. lngMax = 10000000  
  14. '************************  
  15. ClsTimerMM.SetStartDate  
  16. For i = 0 To lngMax  
  17.     If strData = "" Then  
  18.     End If  
  19. Next  
  20. strTextMsg = Left("If strData = """" Then" & String(30, " "), 30) & ":" & ClsTimerMM.ElapsedTime & vbCrLf  
  21. '************************  
  22. ClsTimerMM.SetStartDate  
  23. For i = 0 To lngMax  
  24.     If Len(strData) = 0 Then  
  25.     End If  
  26. Next  
  27. strTextMsg = strTextMsg & Left("If Len(strData) = 0 Then" & String(30, " "), 30) & ":" & ClsTimerMM.ElapsedTime & vbCrLf  
  28. '************************  
  29. ClsTimerMM.SetStartDate  
  30. For i = 0 To lngMax  
  31.     If LenB(strData) = 0 Then  
  32.     End If  
  33. Next  
  34. strTextMsg = strTextMsg & Left("If LenB(strData) = 0 Then" & String(30, " "), 30) & ":" & ClsTimerMM.ElapsedTime & vbCrLf  
  35. '************************  
  36. Me.txtDATA.Value = strTextMsg  
  37. Set ClsTimerMM = Nothing  

0 件のコメント: