2009/05/11

$マークつきの関数について-MidとMid$関数対決

今回、PDFCreatorのソースをみていて気になったのがやたらと出てくる$マーク。UCase$とかOct$とかChr$とかMid$とかがものすごーく気になっていたわけですよ。ググってもひっかかりにくいし、VB6.0のヘルプは手元にないし、でもどうやらフツーに$記号ナシのUcaseやらMidと同じ動作をする。

悶々と々としていたのですが、ちょっと別のコトを調べていたら、スゴい記述をみつけてしまいました。英文サイトのFaster Visual Basic Programs

マジでー?!

$マークつけた方が、処理早いの??? Σ(゚Д゚;≡;゚д゚)

Midの返り値はvariantなのに対して、Mid$の返り値はString型だから、という理由にはナットクしたものの、Mid$なんて隠し玉の存在を知りませんでした。$で文字列を返すというのは、Basicの名残っぽいですよね。

「….Netでも実験してみよー!」と一瞬、思ったものの、.Netに移行してから、Mid関数とかあんまり使わないかなぁ。(´・ω・`)

私の今の行動範囲で現実的にこの知識を生かせるのってむしろVBA?──というわけでAccess2003で実験してみました。


まずはMidとMid$対決の一千万回対決。

MID$の方がちょっと速いですね。

結果

MID :3277 ミリ秒

MID$:3011 ミリ秒

サンプルソース

フォームに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. lngMax = 10000000  
  12. '************************  
  13. ClsTimerMM.SetStartDate  
  14. For i = 0 To lngMax  
  15.     strGet = Mid(strData, "5", 1)  
  16. Next  
  17. strTextMsg = "MID :" & ClsTimerMM.ElapsedTime & vbCrLf  
  18. '************************  
  19. ClsTimerMM.SetStartDate  
  20. For i = 0 To lngMax  
  21.     strGet = Mid$(strData, "5", 1)  
  22. Next  
  23. strTextMsg = strTextMsg & "MID$:" & ClsTimerMM.ElapsedTime & vbCrLf  
  24. '************************  
  25.   
  26. Me.txtDATA.Value = strTextMsg  
  27. Set ClsTimerMM = Nothing  

参考

同類な関数

Chr ChrB CurDir Dir Format Hex Input InputB LCase Left LeftB Mid MidB Oct Right RightB RTrim Space Str String Trim UCase

0 件のコメント: