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 本体側で呼び出されるまで実際の連結は待つとかそういう処理入ったりしないのかな。