@koshian's Tech Log

主に日本語に関する技術などこちらに書こうかと

StringBuilder 的な処理は本当に速いのか Ruby で実験してみた

StringBuilder と 単純な文字列連結 の比較 | @chomado -ちょまど帳- という記事で知ったのだが、どうやら .NET Framework には StringBuilder というのがあるらしい。文字列連結を後に回すことでループなんかで文字列をくっつけていくより速くなるんだとか。

StringBuilder クラス (System.Text)

上記のマニュアルを見てみると、いろんな形式のデータを文字列として変換しておく機能なんかもあるようで。

とりあえず Ruby でやるとしたら文字列を Array に放り込んでいって最後に join() かなあ。それホントに文字列を連結していくより速いのかしらん、とちょっと思ったので実験してみた。

#!/usr/bin/env ruby
require 'benchmark'

test_strings = Array.new
while s = STDIN.gets
  test_strings.push s
end

puts Benchmark.measure {
  string = String.new
  test_strings.each do |s|
    string = string + s
  end
}

puts Benchmark.measure {
  string = Array.new
  test_strings.each do |s|
    string.push s
  end
  string.join('')
}

こんなコードでいいかしら。

サンプルは適当な本を青空文庫からゲットして、mecab分かち書きにしてそれを連結してみることにした。

$ nkf -w serohikino_goshu.txt | mecab -O wakati - | tr ' ' "\n" | ruby bench.rb
  0.050000   0.050000   0.100000 (  0.100551)
  0.000000   0.000000   0.000000 (  0.001951)

わーお、圧倒的に速いですね。ループで文字列連結するときにはこういうのも頭に入れておこう。Ruby 本体側で呼び出されるまで実際の連結は待つとかそういう処理入ったりしないのかな。