misc.log

日常茶飯事とお仕事と

文字列操作の速度比較

XMLの設定ファイルを読む共通モジュールを作るうえで、XPath文字列の作成に、既存コード(別の開発者が作ったもの)では「配列で渡された各タグを、スラッシュで連結する」という方式を採っていた。さらに、その中でFor Each〜In〜 を使ったループと文字列連結でXPath文字列を作っている。こりゃ遅いだろう、と思ったが、実際の具体的な速度は調べたことが無かったので、計測してみることにした。
計測対象は

  1. For Eachで配列の中身を&で連結する
  2. For Eachで配列の中身をStringBuilderを使って連結する
  3. Join関数で配列の中身を連結する
  4. String.Joinメソッドで配列の中身を連結する

結果、速度は早い順に 4、3、2、1だった。具体的な速度は

  1. 0.495221秒
  2. 0.001850秒
  3. 0.001276秒
  4. 0.000332秒

文字列連結は、新しいメモリ領域を確保してそこに連結後の文字列をコピーするので遅いのね。StringBuilderを使うことでかなりの高速化が図れるが、やはり、文字列配列がベースの場合は、.NETクラスライブラリが提供するString.Joinが一番。通常のJoin関数は、旧来のVBとの互換性用なのか、やはりオーバーヘッドがあるようで4倍ほど遅い。
ちなみに、テストは10000個の「テスト」という文字が入った配列を、「/」で連結するという処理で行っている。PCスペックは、Pentium4 3.2GHzでメモリは1GB。
一番遅いコードは

'先頭に区切り文字が入らないようにIfで処理を回避しているが、
'この処理の有無による速度差は0.01秒以下だったので、そのままにしている
For Each key As String In StringArray
    If IsFirst Then
        Result1 = key
        IsFirst = False
    Else
        Result1 &= Delimiter & key
    End If
Next

一番速いコードは

Result3 = String.Join(Delimiter, StringArray)