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編」参照。

Dim ClsTimerMM As ClsTimerMM
Dim strTextMsg As String
'************************
Dim strData As String
Dim strGet As String
Dim lngMax As Long
Dim i As Long
'************************
Set ClsTimerMM = New ClsTimerMM
strData = "あいうえおかきくけこさしすせそ"
lngMax = 10000000
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    strGet = Mid(strData, "5", 1)
Next
strTextMsg = "MID :" & ClsTimerMM.ElapsedTime & vbCrLf
'************************
ClsTimerMM.SetStartDate
For i = 0 To lngMax
    strGet = Mid$(strData, "5", 1)
Next
strTextMsg = strTextMsg & "MID$:" & ClsTimerMM.ElapsedTime & vbCrLf
'************************

Me.txtDATA.Value = strTextMsg
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 件のコメント: