これは重要な知識だよ。
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$()は Variant → String の型変換を行なう必要が無いので、処理速度が向上しているのだろう。関数に "$" を付けて書けるのは BASIC の名残だと思うが、BASIC についてはあまり詳しくないのでこれ以上書くのは遠慮しておく。 文字列関数に "$" を付けるだけで処理が向上する。これは疑いようもない事実なので、日ごろから文字列関数には "$" を付けて書くように心がけた方が良い、というか心がけるべきである。「猫の知ったかぶり」の各ページのサンプルコードの文字列関数に "$" を付けて記述してあるのは、このような理由があるからである。 |