ふなばです。

すでに、どこかで出ていそうな話ですが、1.7 の String と StringIO につい
て。

ruby 1.6 までは、文字列への追加はあまり速いわけではなかったようでした。
僕は、文字列への追加が繰り返される場合は、一旦、配列へつないでおいて、
あとで必要になったとき join していました。

$ cat str.rb
s = ''
1000000.times{s.concat(RUBY_VERSION)}
puts Time.times.utime

$ ruby -v str.rb
ruby 1.6.7 (2002-03-01) [i386-freebsd4.5]
19.3046875

ruby 1.7 では、改善されていて、とても速くなっています。もう、小細工し
なくてもいいようです。

$ ruby-1.7 -v str.rb
ruby 1.7.2 (2002-04-04) [i386-freebsd4.5]
str.rb:3: warning: obsolete method Time::times; use Process::times
1.2421875

じつは、文字列を繰り返し追加する場合というのは、本当はファイルへの書き
出しのようにしたかったのでした。僕は自前で簡単なものを書いてしのいでい
ました。しかし、1.7 では、StringIO があるので、今後はそれも必要なくな
るのかもしれません。

ところが、StringIO は、まだあまり速くないようです。1.6 の文字列なみです。

$ cat sio.rb
require 'stringio'
s = StringIO.new
1000000.times{s.write(RUBY_VERSION)}
puts Time.times.utime

$ ruby-1.7 -v sio.rb
ruby 1.7.2 (2002-04-04) [i386-freebsd4.5]
sio.rb:4: warning: obsolete method Time::times; use Process::times
19.4609375

1.7 では、文字列の追加が速いので、MoonWolf さんの ruby 版 StringIO を
つかったほうが速いようです。

$ ruby-1.7 -v sio2.rb
ruby 1.7.2 (2002-04-04) [i386-freebsd4.5]
sio2.rb:4: warning: obsolete method Time::times; use Process::times
6.65625