ブログトップ 記事一覧 ログイン 無料ブログ開設

category: miscellaneous このページをアンテナに追加 RSSフィード

2004-12-02 っていうかホテルの剃刀よ...

[] 文字列操作の速度比較

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)

tanaka_otupaitanaka_otupai 2011/10/24 21:00 おお、これずっと気になってたんだ。String.Joinが見た目に綺麗で好きだけど、文字列連結より遅いだろうと思ってた。だが、これからは邁進してString.Joinが使えるよ。ありがとう。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/frontline/20041202/1173749287