● 文字列編集関数には $ をつけよう!! ●

これは重要な知識だよ。

VBでは色々な文字列編集関数が用意されている。今更挙げる必要は無いと思うが Left()、Right()、Format()、Mid()、Space()、String()、Chr() などがそれにあたる。Left() をヘルプ(VB5.0用)で調べてみると、返り値は「バリアント型 (内部処理形式StringのVariant) の値を返す」とある。実はこれ、結構重要な記述だったりする。一方 Left$() に関して、ヘルプには何の記述も無い(表示されるページは Left() と同じ)。

  Dim TextBuff As String
  TextBuff = Left("AABBCCDDEEFFGG", 10)
  TextBuff = Left$("AABBCCDDEEFFGG", 10)
非常に簡単な処理である。両者とも処理結果はまったく同じで "AABBCCDDEE" が返ることは一目瞭然。けれども1つ、決定的に違うことがある。それは処理速度。実は "$" を付けることで処理時間が2倍ほど向上する。嘘だと思うなら、以下の処理を実行してみると良い。
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()
    Dim StartTime As Long
    Dim EndTime As Long
    Dim i As Long
    Dim TextBuff As String
    Const MAX_NUM = 100000

    Debug.Print "Left() を使用"
    StartTime = GetTickCount
    For i = 0 To MAX_NUM
        TextBuff = Left("AABBCCDDEEFFGG", 10)
    Next i
    EndTime = GetTickCount
    Debug.Print EndTime - StartTime

    Debug.Print "Left$() を使用"
    StartTime = GetTickCount
    For i = 0 To MAX_NUM
        TextBuff = Left$("AABBCCDDEEFFGG", 10)
    Next i
    EndTime = GetTickCount
    Debug.Print EndTime - StartTime
End Sub
両者になぜ差が生じるのであろうか。ここで分かっていることをまとめると以下の2つになる。

・Left() は返り値を String 型の変数に格納する時点で Variant → String の型変換を行う
・Left$() の処理は Left() の倍程度速い

ここからは、結果をふまえて推測で話すことになる。私が思うに文字列関数に "$" を付けると「バリアントではなく文字列の値」を返してくれるのだと思う。Left() と違い Left$()は Variant → String の型変換を行なう必要が無いので、処理速度が向上しているのだろう。関数に "$" を付けて書けるのは BASIC の名残だと思うが、BASIC についてはあまり詳しくないのでこれ以上書くのは遠慮しておく。

文字列関数に "$" を付けるだけで処理が向上する。これは疑いようもない事実なので、日ごろから文字列関数には "$" を付けて書くように心がけた方が良い、というか心がけるべきである。「猫の知ったかぶり」の各ページのサンプルコードの文字列関数に "$" を付けて記述してあるのは、このような理由があるからである。


戻る