From: tadf@... Date: 2002-04-06T00:30:08+09:00 Subject: [ruby-dev:16761] StringIO ふなばです。 すでに、どこかで出ていそうな話ですが、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