メイン画像

VBScript - 文字列を高速に連結する方法はどれだ?

VBScript - 文字列を高速に連結する方法はどれだ?


VBScript で高速に文字列を連結する方法を調べました。

調査に使った連結方法は次の3つです。

  • アンド(&)でつなぐ
    • VB 系ではこのやり方が一般的ですね。
  • 文字列を入れる配列を事前に確保しておき、その中身を書き換える
  • .NET の StringBuilder クラスを使う

 

一番速いのはどの方法でしょうか?

30秒間で連結できた文字数が多いものほど、高速に文字列を連結できる方法とします。

検証結果

結論から言います。

あらかじめ確保しておいた配列を書き換えていく方法がぶっちぎりで高速でした。

30秒で連結できた文字数は下表のとおり。
文字数は3回計測した結果の平均値です。

連結方法 連結文字数
配列書き換え 6,473,335字
StringBuilder 3,875,293字
アンド(& 405,101字

StringBuilder クラスが一番速いのでは? と思っていましたが、裏切られましたね。

アンドで連結する方法は遅すぎて論外。

配列を事前に確保しておき、その中身を書き換える

この方法が一番速かったです。

やり方は以下のとおりです。

  1. 文字列を格納する配列を大きめのサイズで確保しておく。

  2. 配列に文字列を追加して、追加した文字数分インデックスを進める。
    すべての文字列を追加するまで、この処理を繰り返す。

    もし確保してある配列の大きさを超えそうになったら、配列のサイズを拡張する。
    ギリギリではなく、大きめに拡張する。

  3. すべての文字列を追加したら、文字列の配列から未使用部分を切り捨てる。

  4. 配列内の文字をすべて連結する。

Dim start
start = Timer

Dim sAll
sAll = ""

Const sAdd = "a"
Const SIZE = 10000

'文字列を格納する配列を事前に確保する
Dim tmpStr()
ReDim tmpStr(SIZE)

'確保した配列のどこまでが利用済みかインデックスを入れる変数
Dim lastPos
lastPos = -1

Do
    lastPos = lastPos + 1

    '配列のサイズを超えそうになったら拡張する
    If UBound(tmpStr) < lastPos Then
        ReDim Preserve tmpStr(UBound(tmpStr) + SIZE)
    End If

    '配列の利用済み配列の次の部分に追加文字列を代入する
    tmpStr(lastPos) = sAdd
Loop Until (Timer - start) > 30

'確保した配列のうち、利用しなかった部分を切り捨てる
ReDim Preserve tmpStr(lastPos)

'配列内の文字を連結する
sAll = Join(tmpStr, "")

MsgBox Len(sAll)

.NET の StringBuilder クラスを使う

配列を書き換える方法に比べれば遅いですが、これでも十分速いです。

何より手軽に使えるので、こちらを採用するのもありでしょう。

Dim start
start = Timer

Dim sAll
Set sAll = CreateObject("System.Text.StringBuilder")

Const sAdd = "a"

Do
    sAll.Append_3 sAdd
Loop Until (Timer - start) > 30

MsgBox Len(sAll.ToString)

アンド(&)で連結する

よくやるやり方ですが、長い文字列になりそうなときは使わない方が無難です。

Dim start
start = Timer

Dim sAll
sAll = ""

Const sAdd = "a"

Do
    sAll = sAll & sAdd
Loop Until (Timer - start) > 30

MsgBox Len(sAll)

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事